题目来自牛客网《剑指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.相交链表
本文介绍了一种高效的方法来解决链表相交问题,通过将两个链表拼接,利用双指针技巧找到第一个公共节点,适用于《剑指Offer》及LeetCode 160题。

被折叠的 条评论
为什么被折叠?



