题意
给两个链表求第一个公共节点,有可能不存在公共节点。
分析
考虑两个链表不相交部分的长度分别为a, b, 相交部分长度 c. 先让两个指针分别指向 headA,headB,每次一起往后走一步,如果到了链表尾,下一步走到另一个链表的表头。
如果两个链表相交,那么会在第一个相交节点相遇,此时两个指针路程都是 a + b + c.
同时要防止没有相交部分无限循环,用一个变量记录指针触尾的次数,当次数之和大于 2 说明不存在公共部分。
/**
* 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) {
if(headA == NULL || headB == NULL)return NULL;
ListNode* pa = headA, *pb = headB;
int cnt = 0;
while(pa != NULL && pb != NULL){
if(pa == pb)return pa;
pa = pa->next;
pb = pb->next;
if(pa == NULL)pa = headB, cnt ++;
if(pb == NULL)pb = headA, cnt ++;
if(cnt > 2)break;
}
return NULL;
}
};