题目来自牛客网《剑指Offer》
题目描述
输入两个链表,找出它们的第一个公共结点。
分析
重点看一下被大肆赞扬的“拼接法”:
若两个链表相交,则相交结点之后的结点是两个链表所共有的,可以看做是下图中的 Z 部分,相交结点就是Z部分的左端,若a,b两个指针分别遍历时同时停在了Z部分的左端,即可证明两个链表相交。
将两个链表拼接后,a,b指针同时前进,速度一致,相交时他们经过的结点数自然也是相同的。即下图中的X+Z+Y
与Y+Z+X
。
若两个链表不相交,没有共同的部分,类似于下图
将他们拼接起来后,a,b也会同时遍历到链表的末尾,同时指向NULL。
代码
C++
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
if(pHead1 == NULL || pHead2 == NULL)
return NULL;
ListNode *p1 = pHead1;
ListNode *p2 = pHead2;
while( p1 != p2)
{
p1 = p1 ? p1->next : pHead2;
p2 = p2 ? p2->next : pHead1;
}
return p1;
}
};
补充
力扣(LeetCode)有一道类似的题目:160.相交链表