CS-Notes全部笔记在阅读器中打开

52. 两个链表的第一个公共结点

Leetcode

题目描述

题目描述的配图

解题思路

设 A 的长度为 a + c,B 的长度为 b + c,其中 c 为尾部公共部分长度,可知 a + c + b = b + c + a。

当访问链表 A 的指针访问到链表尾部时,令它从链表 B 的头部重新开始访问链表 B;同样地,当访问链表 B 的指针访问到链表尾部时,令它从链表 A 的头部重新开始访问链表 A。这样两个指针都经过 a + c + b 个节点后同时到达交点。如果两个链表不相交,两个指针各自走完两个链表后同时变为 null,循环结束,返回 null。

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
    ListNode l1 = headA, l2 = headB;
    while (l1 != l2) {
        l1 = (l1 == null) ? headB : l1.next;
        l2 = (l2 == null) ? headA : l2.next;
    }
    return l1;
}

在阅读器中可以用目录和搜索、切换深色模式、练习这篇笔记中的面试题:打开《52. 两个链表的第一个公共结点》