public class Solution {
public ListNode detectCycle(ListNode head) {
if (head == null ){
return null;
}
ListNode slow = head;
ListNode fast = head;
while(fast.next != null && fast.next.next != null){
slow = slow.next;
fast = fast.next.next;
if(slow == fast){
ListNode tmp = head;
while(tmp != slow){
tmp = tmp.next;
slow = slow.next;
}
return tmp;
}
}
return null;
}
}
快慢指针,当快指针与慢指针相遇的时候,快指针比慢指针多走X,同时,快指针比慢指针多走一个环的长度,X等于这个环的长度,这个时候慢指针在环里面走的距离是A,从起点到环的起点假设是B,A+B=X,而慢指针再走X-B必定会和一个开头的指针在环开始的地方相遇。