【63. 相交链表】

10 阅读1分钟

题目

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。

图示两个链表在节点 c1 开始相交

题目数据 保证 整个链式结构中不存在环。

注意,函数返回结果后,链表必须 保持其原始结构 。

题解

方式一:双指针

两个指针分别从A、B头节点开始,每次移动一个位置,走到当前链表尾部时转向另一个链表头节点。
两指针相遇的节点就是结果

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
    ListNode p1 = headA;
    ListNode p2 = headB;
    // 链表长度一致,则一次遍历后p1、p2同时为null
    // 链表长度不一致,则两次遍历后p1、p2同时为null
    while(p1 != null || p2 != null) {
        if (p1 == null) p1 = headB;
        if (p2 == null) p2 = headA;
        if (p1 == p2) {
            return p1;
        }
        p1 = p1.next;
        p2 = p2.next;
    }
    return null;
}

方式二:哈希表

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

总结

算法:双指针
数据结构:哈希表