剑指offer三十六--两个链表的第一个公共结点

题目描述

两个链表的第一个公共结点

思路

思路一:辅助map遍历2次链表

思路二:长的那个链表截取长度差,两链表长度相同,同时遍历找到相同节点

举例 1 2 3 4 5
6 4 5
将前面的12给截取,最后同时遍历后三个得到4

思路三 以如下方式遍历两链表

1 2 3 4 5 nullptr 5 4 6 nullptr
6 4 5 nullptr 1 2 3 4 5 nullptr
当两者节点相同时结束
可以观察到4 5 重合时前面的元素个数一样
数学归纳一般规律 AX BX;X代表相同部分,A、B代表不同部分(假设长度为m、n个)
A(m) X B(m) X
B(n) X A(n) X
可见最后X前的长度均为m+n+X个
特殊情况考虑
情况一123 456 二者没有公共点 最后找到nullptr p1换成p2
情况二m=n 123 423 在第一次就找到2时公共点 没问题
情况三 一个链表为{nullptr} 另一个为{1 2 3 nullptr}
1 2 3 nullptr nullptr
nullptr 1 2 3 nullptr
综上我们得出如下结论:
当指向nullptr时切换另一个链表否则一直在本链表上遍历

代码

ListNode*FindFirstCommonNode(ListNode*pHead1,ListNode*pHead2) {  
        ListNode* p1 = pHead1;
        ListNode* p2 = pHead2;
        while(p1 != p2) {
            if(p1 == nullptr)
                p1 = pHead2;// 链表一走完换二
            else
                p1 = p1->next;
            if(p2 == nullptr) 
                p2 = pHead1;// 链表二走完换一
            else
                p2 = p2->next;
        }
        return p1;  
}
原文地址:https://www.cnblogs.com/linxuesong/p/12222364.html