Linked List Cycle II
找到相遇的点之后,只要让两个指针分别从head 和相遇点出发,走同样多的步数再相遇,就找到了链接开始的地方了。
要画个证明一下。
public class Solution {
public ListNode detectCycle(ListNode head) {
if(head == null) return null;
ListNode result = null, slow = head, fast = head;
int count = 0;
while(fast.next != null && fast.next.next != null) {
slow = slow.next;
fast = fast.next.next;
count++;
if(slow == fast) {
result = slow;
break;
}
}
if(result == null) return null;
slow = head;
fast = result;
while(slow != fast) {
slow = slow.next;
fast = fast.next;
}
return slow;
}
}

浙公网安备 33010602011771号