剑指Offer 36.两个链表的第一个公共结点(C++)

题目来自牛客网《剑指Offer》

题目描述

输入两个链表,找出它们的第一个公共结点。

分析

重点看一下被大肆赞扬的“拼接法”:
若两个链表相交,则相交结点之后的结点是两个链表所共有的,可以看做是下图中的 Z 部分,相交结点就是Z部分的左端,若a,b两个指针分别遍历时同时停在了Z部分的左端,即可证明两个链表相交。
剑指Offer 36.两个链表的第一个公共结点(C++)_第1张图片
将两个链表拼接后,a,b指针同时前进,速度一致,相交时他们经过的结点数自然也是相同的。即下图中的X+Z+YY+Z+X
剑指Offer 36.两个链表的第一个公共结点(C++)_第2张图片
若两个链表不相交,没有共同的部分,类似于下图
剑指Offer 36.两个链表的第一个公共结点(C++)_第3张图片
将他们拼接起来后,a,b也会同时遍历到链表的末尾,同时指向NULL。
剑指Offer 36.两个链表的第一个公共结点(C++)_第4张图片

代码

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)