JZ36 两个链表的第一个公共结点
原题链接
描述
输入两个无环的单链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
示例
输入:{1,2,3},{4,5},{6,7}
返回值:{6,7}
说明:第一个参数{1,2,3}代表是第一个链表非公共部分,第二个参数{4,5}代表是第二个链表非公共部分,最后的{6,7}表示的是2个链表的公共部分,这3个参数最后在后台会组装成为2个两个无环的单链表,且是有公共节点的
思路
如图, 黑色红色代表两个链表中非公共的部分,绿色代表公共部分。显然:黑色的长度+绿色的长度+红色的长度 = 红色的长度 +绿色的长度 + 黑色的长度。所以让两个链表从头开始遍历,到尾结点时,从另一个链表的头部开始遍历,若干个节点后相遇在第一个公共结点。
解答
public class Solution {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
ListNode n1= pHead1, n2 = pHead2;
while (n1 != n2){
n1 = n1 == null ? pHead2 : n1.next;
n2 = n2 == null ? pHead1 : n2.next;
}
return n1;
}
}
更
Q:为什么没有公共结点时不会死循环?
A:没有公共结点时,可以看作 null是他们的公共结点,第二轮互换后,会互相指向对方的末尾结点的next,即null
本文来自博客园,作者:klaus08,转载请注明原文链接:https://www.cnblogs.com/klaus08/p/15104982.html