//快慢指针能相遇说明有环!
public class Solution {
public boolean hasCycle(ListNode head) {
if(head==null)
return false;
ListNode fast=head;
ListNode slow=head;
while(fast!=null&&fast.next!=null){
fast=fast.next.next;
slow=slow.next;
if(fast==slow)
return true;
}
return false;
}
}
为什么快指针fast每次走两步而慢指针每次走一步呢?
因为slow指针和fast指针都会进入环内,就像在环形跑道内不同位置的两个人。slow指针在后面,fast指针在前面,但实际上fast指针也在追slow指针,希望能超slow指针一圈。那么fast指针总会追上slow指针的。那么fast指针会不会跳过slow指针呢?不会的,因为fast每次走2步,slow每次走1步,假设两者在环内的距离差为N,那么每次走动,距离差N都会缩小一步,因为fast与slow指针的步长差是1。最终,N会减少到0,也就是两者会相遇。