判断链表是否有环的快慢指针法

//快慢指针能相遇说明有环!
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,也就是两者会相遇。

猜你喜欢

转载自blog.csdn.net/weixin_38436336/article/details/88941347