
点击查看代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *findFirstCommonNode(ListNode *headA, ListNode *headB) {
auto p = headA, q = headB;
while (p != q) {
if (p) p = p->next;
else p = headB;
if (q) q = q->next;
else q = headA;
}
return p;
}
};
- p 指针初始时指向 headA,每次都往后移动一步,当 p 走到 headA 的末尾,也就是 p = NULL 时,再从 headB 往后走;同理,q 指针初始时指向 headB,每次都往后移动一步,当 q 走到 headB 的末尾,也就是 q = NULL 时,再从 headA 往后走;
- 循环退出有两种情况:
① 两个链表有公共结点,设 headA 对应链表的长度为 a + c,headB 对应链表的长度为 b + c,其中 c 为公共段的长度,那么当 p 和 q 各走 a + b + c 步时,p 和 q 一定会在公共结点相遇;
② 两个链表没有公共结点,设 headA 对应链表的长度为 a,headB 对应链表的长度为 b,那么 p 和 q 各走 a + b 步时,p = q = NULL,也就是没有公共结点;