思路:
第一次相遇时: fast走的步数是slow的2倍,即:f=2s
fast比slow多走了n个环,假设环的长度是b,f=s+nb 因此有f=2nb, s=nb
分析: 让指针从头部一直走k步,那么所有走到链表入口节点时的步数是:k=a+nb.而目前slow已经走了nb,因此再让slow走a步就到入口处了。
第二次相遇时: slow位置不变,fast指向头结点,slow与fast每次都只走一步,再相遇时的节点即是入口节点。
public ListNode detectCycle(ListNode head) {
ListNode slow = head;
ListNode fast = head;
while(slow != null && fast != null){
if(slow.next != null)
slow = slow.next;
else break;
if(fast.next != null && fast.next.next != null)
fast = fast.next.next;
else break;
if(slow == fast){
fast = head;
while(slow != fast){
slow = slow.next;
fast = fast.next;
}
return slow;
}
}
return null;
}