leetcode 力扣 142 环形链表2

100 阅读1分钟

lc142.jpeg

数学题
slowfast指针相遇时,fast走过的距离是x + n(y + z)n表示fast已经走了n圈。 slow走过的距离是x + y。因为fast的距离是slow的两倍,所以得到上图第一条式子。

化简后,得到最下面的式子。相遇后,我们可以让fast指针回到headslow保持原位。 因为x等于slow走了(n - 1)圈加上z,所以可以让fastslow同步移动,直到相遇就到了入口点。

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;
}