双指针
快慢指针一起动,快指针一次两个节点,慢指针一次一个节点,若有环一定可以相遇。因为相对于慢指针,快指针是一次动一个节点
相遇时,fast = x + y + n(y+z),slow = x+y
但fast是一次两动,所以移动距离是slow的2倍 ,可得出 x + y + n( y + z ) = 2 (x + y)
得出 n (y + z) = x + y ,当n = 1时,x = z
所以此时让两个节点,一个从头节点开始,一个从相遇节点开始移动,都是一次一动,一定可以相遇在环形入口节点
public class Solution {
public ListNode detectCycle(ListNode head) {
ListNode slow = head;
ListNode fast = head;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
if(fast == slow){
ListNode index1 = fast;
ListNode index2 = head;
while(index1 != index2){
index1 = index1.next;
index2 = index2.next;
}return index1;
}
}
return null;
}
}