这个题的思路很巧妙,只要想明白了,写起来非常简单,没有什么trick
思路就是,fast每次移动两步,slow移动一步,当他们相遇的时候 他们距离cycle起始点的距离 与head距离cycle起始点的距离相等。这是因为当slow第一次到达cycle起始点的时候,fast一定已经在cycle之中k步,k就是cycle之前直线那部分list的长度。那么他们相遇就需要cycleSize - k步,对于slow来说(或者用fast想也一样),它从cycle入口走了cycleSize - k步,那么它一定就离入口k步 就和非环部分长度相等了,这时记得把一个指针放到head 让他们对着走,再相遇的时候就是cycle入口了。
public class Solution {
public ListNode detectCycle(ListNode head) {
ListNode fast = head;
ListNode slow = head;
while ( fast != null && fast.next != null ){
fast = fast.next.next;
slow = slow.next;
if ( fast == slow){
slow = head;
break;
}
}
if ( fast == null || fast.next == null)
return null;
while ( fast != slow ){
slow = slow.next;
fast = fast.next;
}
return fast;
}
}