66. 两个链表的第一个公共结点
输入两个链表,找出它们的第一个公共结点。
当不存在公共节点时,返回空节点。
数据范围
链表长度 [1,2000]。
样例
给出两个链表如下所示:
A: a1 → a2
↘
c1 → c2 → c3
↗
B: b1 → b2 → b3
输出第一个公共节点c1
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
* 两个链表要么是Y字型(有具体交点),要么是不相交的(空节点)
* 利用a + b + c = b + c + a总路程思想找交点
* 就是引入两个指针,同时走完两个链表,要么相遇在具体交点,要么在空节点
*/
class Solution {
public:
ListNode *findFirstCommonNode(ListNode *headA, ListNode *headB) {
auto p = headA, q = headB;
while (p != q){//走完总路程,要么都在具体交点,要么都是空节点
if (p != NULL) p = p->next;//判断是否该走另一条链表了
else p = headB;
if (q != NULL) q = q->next;
else q = headA;
}
return p;
}
};