遍历两表求差值,谁更长谁先走,走过差值一起走,相遇即是第一公共点。
struct ListNode* FindFirstCommonNode(struct ListNode* pHead1, struct ListNode* pHead2 )
{
int len1 = 0,len2 = 0;
struct ListNode* p1 = pHead1;
struct ListNode* p2 = pHead2;
for(; p1 != NULL; len1++) p1 = p1->next; //求len1
for(; p2 != NULL; len2++) p2 = p2->next; //求len2
if(len1 == 0 || len2 == 0)
return NULL; //某一个链表为空,肯定没公共点,两个都空的话,就一起空呗
else if (len1 >= len2){ //若链表1更长
int dis = len1 - len2; //求链表长度差
while (dis > 0){
pHead1 = pHead1->next;
dis--;
} //长表先走,走到从该点开始的长度与短表相同时停下
}
else{ //链表2更长,情况同上
int dis = len2 - len1;
while (dis > 0){
pHead2 = pHead2->next;
dis--;
}
} //长表先走,走到从该点开始的长度与短表相同时停下
while(pHead1 != pHead2){ //两表一起走,相遇时停下
pHead1 = pHead1->next;
pHead2 = pHead2->next;
}
return pHead1; //当然,return pHead2也可以
}