求有环单链表的环长、环起点
public ListNode EntryNodeOfLoop(ListNode pHead)
{
if(pHead==null||pHead.next==null) return null;
ListNode l=pHead,f=pHead;
while(f!=null&&f.next!=null){
//1.判断是否有环
l=l.next;
f=f.next.next;
if(l==f){
f=pHead;
while(l!=f){
l=l.next;
f=f.next;
}
return f;
}
}
return null;
}
1.l和f从头开始扫描链表。l每次走一步,f每次走两步。如果有环,l和f会相遇。
2.在环上相遇时,f会比l多走n圈,f走的长度是l的两倍。(如果LenA<R,f会比l多走1圈,理解起来容易一点)
l走的长度 S = LenA + x,
f走的长度 2S = LenA + n*R + x,
所以可以知道,LenA + x = n*R, LenA = n*R -x;
因此,相遇时让f回到Head,然后l和f每次走一步,相遇点就是环的起点。
3.求环长可以设一个n,第一次相遇时f不动,l每走一步n+1,再相遇时n就是环长。
参考:https://www.cnblogs.com/xudong-bupt/p/3667729.html