offer_36
概要:两个链表的第一个公共结点
题目描述
输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方 式显示的,保证传入数据是正确的)
链表形式类似于下面这样(这种是有交点的情况):
思路
让指向长的链表的指针领先走链表长度差值的步数,这样可以使两指针同时到达链表尾部,如果找到公共结点,返回即可。
用两个指针,分别指向两个链表头部,同时往后走,当其中一个走到链表尾时,则令其指向另一个链表头。另一个链表也是如此,走到链表尾时,也指向另一个链表头。此时已满足领先要走步数要求。
①P1、P2分别指向pHead1、pHead2链表头部;
②P1、P2向后走m步,此时P1指向pHead1尾部;
③使P1指向pHead2头部;
④P2指向pHead2尾部;
⑤使P2指向pHead1头部,此时P2在pHead2中已走了m-n步。P1、P2继续向后走,直至找到公共结点,后续两链表长度均为m。
思路图解:
思路动图:
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
//长度相同有公共结点,第一次就遍历到;没有公共结点,走到尾部NULL相遇,返回NULL
//长度不同有公共结点,第一遍走完长度的差值就出来了,第二遍一起到公共结点;没有公共,一起到结尾NULL。
ListNode p1 = pHead1;
ListNode p2 = pHead2;
while (p1 != p2) {
//如果当前结点为 null,就指向另一个链表的头结点开始第二次遍历
p1 = (p1 == null) ? pHead2 : (p1 = p1.next);
p2 = (p2 == null) ? pHead1 : (p2 = p2.next);
}
return p1;
}
参考链接
https://blog.csdn.net/qq_38473097/article/details/106835500
https://blog.csdn.net/ananbei/article/details/80589360