分析
我们可以采用快慢指针来解决。让fast一次走两步fast=fast.next.next;(为什么是两步而不是散步或者四步呢,大家可以想一想),让slow一次走一步 slow=slow.next;,如果有环(则会有fast==slow)。
注意:如果一次走三步或者一次走四步的话,当环很小时,fast可能会每次与slow错过,经过好久之后才会想等。而fast一次走两步的话,会使错过的几率变小(不用一直绕着环走),如果有环的话,能早一点得到fast==null。
结合图来理解一下
一起走fast==slow的话证明有环
代码如下:
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;
}
}