双指针法
如果两个链表的公共部分长度相同(图2),那么分别使两个链表的头指针依次遍历,其相遇点即为首个公共节点。但大部分两个链表的公共部分长度并不相同,所以我们要想办法使其等长。设假
设链表A
长度为a
, 链表B
的长度为b
,此时a != b
但是,a+b == b+a
因此,可以让a+b作为链表A的新长度,b+a作为链表B的新长度,如图:
这样两个新链表的头指针依次遍历,会在首个公共节点相遇,其运动过程我们可以等价如下图:
注意:若两链表无公共部分,则相当于其公共点为NULL,最终也是返回NULL。
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
ListNode* a=pHead1;
ListNode* b=pHead2;
while(a!=b)
{
a=a?a->next:pHead2;
b=b?b->next:pHead1;
}
return a;
}
};