【题目】
输入两个链表,找出它们的第一个公共结点。
【代码】
public ListNode FindFirstCommonNode(ListNode pHead1,
ListNode pHead2) {
ListNode p1 = pHead1;
ListNode p2 = pHead2;
while(p1!=p2){
p1 = (p1==null ? pHead2 : p1.next);
p2 = (p2==null ? pHead1 : p2.next);
}
return p1;
}
【理解】
通过追赶节约了对齐长度而不用记长度差,但如果不相交就会一直你追我赶
假设m大,n小,短的走到n的第n步跳到长的起点(新的长的),此时之前的长的走到m的第n步,两个继续走,当之前的长的走到m的第m步时跳到短的起点时,新的长的走到了(m - n)步,现在两个需要走的长度就都是n了。
两个链表一定有交点的话,楼主方法是指向短链表指针先走完,然后指向长链表,指向长链表指针后走完,指向短链表。所以,第二次走过,一定会在交点相遇。
长度相同有公共结点,第一次就遍历到;
没有公共结点,走到尾部NULL相遇,返回NULL
长度不同有公共结点,第一遍差值就出来了,第二遍一起到公共结点;
没有公共,一起到结尾NULL。