相交情况:两条链长度分别是x+z和y+z,那么两个点把两条链都走完,需要走的长度分别是 x+z+y+z和y+z+x+z,速度相等的情况下,当点a走完x+z+y,点b同时走完y+z+x,此时一定在最后一个z的起始点相遇。
不相交情况:两条链长分别是x和y,走完两条链需要走的长度分别是x+y和y+x,速度相等情况下,点a走完x+y,点b同时走完y+x,两点在末尾相遇。两个尾节点的next都为null,跳出循环,并且返回null。
这个问题条件如果是长度相同的链表找公共结点就很简单;那么怎么把长度不同的问题转化为长度相同的问题呢,其实是用到了很朴素的思想,即a虽然不等于b,但是a+b=b+a,也就是遍历完a再接着遍历b和遍历完b再接着遍历a,他们遍历的长度是一样的,这样就转化为长度相同的问题了。原创者确实厉害。
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
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;
}
}