https://leetcode.com/problems/linked-list-cycle-ii/
解题思路:
首先推荐两篇博文,写的很全面。
http://www.cnblogs.com/hiddenfox/p/3408931.html
http://blog.csdn.net/cs_guoxiaozhu/article/details/14209743
如果链表有环,那么 slow 走的路程是 fast 的一半。即:2(a+b) = a+b+c+b => a = c.
所以,在 slow 与 fast 相遇后,让 slow 回到起点,fast 在 Z 点,一起走相遇的点就是环的交点 Y 点。
/**
* 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) return null;
ListNode slow = head, fast = head;
while(true) {
if(fast.next == null || fast.next.next == null)
return null;
slow = slow.next;
fast = fast.next.next;
if(slow == fast) break;
}
slow = head;
while(slow != fast) {
slow = slow.next;
fast = fast.next;
}
return slow;
}
}