两个链表的第一个公共结点
举例 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