/*
思路:1 判断是否有循环。 2 用快慢指针找到循环重合的节点。 3 找出循环开始的节点;
证明 2步骤找到的节点 距离 循环开始的节点与list开头的节点 距离 循环开始的节点相等
证: 快节点是慢节点速度的两倍, 1 设开始到第一个循环距离k 设 第一个节点到相遇的节点距离是x。 n是循环的圈数 r是循环内节点的个数。 2 2*(k+x)= k + n*r 整理可得 k+x = n*r, 假设n等于1, 那么k = r - n;而r-n 是2步骤中找到的节点到循环开始节点的距离;
*/
/**
* Definition for ListNode
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
/**
* @param head: The first node of linked list.
* @return: The node where the cycle begins. if there is no cycle, return null
*/
public ListNode detectCycle(ListNode head) {
if(head == null || head.next == null) return null;
// write your code here
ListNode node = head;
ListNode fast = head.next.next, slow = head.next;
while(fast != slow) {
if(fast == null || fast.next == null) return null;
fast = fast.next.next;
slow = slow.next;
}
while(node != slow) {
node = node.next;
slow = slow.next;
}
return slow;
}
}