📜  用于查找两个链表的交点的Java程序(1)

📅  最后修改于: 2023-12-03 15:27:11.461000             🧑  作者: Mango

查找两个链表的交点的Java程序

在开发中,经常会出现两个链表有交点的情况,本文将介绍如何使用Java编写程序来查找两个链表的交点。

思路

要查找两个链表的交点,有以下两种解决方式。

1. 遍历

第一种方式是遍历。

假设两个链表的长度分别为m和n,先让较长的链表先走n-m步,然后两个链表同时开始遍历,找到第一个相同的节点即为它们的交点。

具体实现:

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
    int lengthA = getLength(headA);
    int lengthB = getLength(headB);
    int diff = lengthA - lengthB;
    if (diff < 0) {
        return getIntersectionNode(headB, headA);
    }
    for (int i = 0; i < diff; i++) {
        headA = headA.next;
    }
    while (headA != null && headB != null && headA != headB) {
        headA = headA.next;
        headB = headB.next;
    }
    return headA;
}

private int getLength(ListNode head) {
    int length = 0;
    ListNode cur = head;
    while (cur != null) {
        length++;
        cur = cur.next;
    }
    return length;
}
2. 哈希表

第二种方式是使用哈希表。

先遍历其中一个链表,将每个节点通过哈希表记录下来。

再遍历另一个链表,查找哈希表中是否有相同的节点。

具体实现:

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
    Set<ListNode> set = new HashSet<>();
    ListNode node = headA;
    while (node != null) {
        set.add(node);
        node = node.next;
    }
    node = headB;
    while (node != null) {
        if (set.contains(node)) {
            return node;
        }
        node = node.next;
    }
    return null;
}
总结

以上就是查找两个链表的交点的两种解决方式,具体使用哪种方式,应根据实际情况来选择。

使用遍历方式的时间复杂度为O(m+n),使用哈希表的时间复杂度为O(m+n),但空间复杂度为O(m)或O(n),比使用遍历方式更耗费空间。

在实际使用中应根据实际情况来选择合适的方式。