Given a linked list, return the node where the cycle begins. If there is no cycle, return null.

Note: Do not modify the linked list.

Follow up:
Can you solve it without using extra space?

 

141题的延伸,求出循环点。

 

 

可以用数学方法证明出slow与find相遇的位置一定是所求的点。

 

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode detectCycle(ListNode head) {
        if( head == null || head.next == null )
            return null;
        ListNode fast = head;
        ListNode slow = head;

        while( fast != null && fast.next != null  ){
            slow = slow.next;
            fast = fast.next.next;
            if( fast == slow ){
                ListNode find = head;
                while( find != slow ){
                    find = find.next;
                    slow = slow.next;
                }
                return find;
            }
        }

        return null;

        
    }
}