判断链表是否有环

如上图所示 我们设置快慢两个指针,fast, slow fast一次前进两步,slow一次前进一步,
设a为第一个节点到入环节点的距离。
a=[0->2] 设b为入环口到相遇点的距离。
b=[2->6] 设c为相遇点到入环口的距离。
c=[6->2] 当fast,和slow相遇的时候,fast经过的节点是slow的两倍,
设slow经过的节点数为S 根据上面的设置 可知 S=a+b ,2S=a+b+c+b,
可知 a=c,此时让slow回到第一个节点, fast处于第一次相遇的节点,此时slow从第一个节点出发,因为a=c,所以fast,和slow会在入环口第二次相遇,得到要求的节点。
public class Solution {
public ListNode detectCycle(ListNode head) {
ListNode fast =head;
ListNode slow =head;
if(head==null||head.next==null){
return null;
}
while(fast!=null&&fast.next!=null){
fast =fast.next.next;
slow = slow.next;
if(fast==slow){
fast =head;
while(fast!=slow){
fast = fast.next;
slow = slow.next;
}
return fast;
}
}
return null;
}
}

浙公网安备 33010602011771号