数学题
当slow和fast指针相遇时,fast走过的距离是x + n(y + z),n表示fast已经走了n圈。
slow走过的距离是x + y。因为fast的距离是slow的两倍,所以得到上图第一条式子。
化简后,得到最下面的式子。相遇后,我们可以让fast指针回到head,slow保持原位。
因为x等于slow走了(n - 1)圈加上z,所以可以让fast和slow同步移动,直到相遇就到了入口点。
public ListNode detectCycle(ListNode head) {
if (head == null) {
return null;
}
ListNode fast = head, slow = head;
while (fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
if (fast == slow) {
fast = head;
while (fast != slow) {
fast = fast.next;
slow = slow.next;
}
return fast;
}
}
return null;
}