141. 环形链表

 

 

 

 

快慢指针,也叫佛洛依德算法

即使用一个快指针,每次前进2位,慢指针每次前进1位,如果存在环,

则快慢指针必然会在环的开始处相交(可以参考追及问题)

时间O(n),空间O(1)

public boolean hasCycle(ListNode head) {
        // 首先确保后续节点存在
        if (head==null || head.next==null) return false;
        ListNode fast=head.next,slow=head;
        // 快指针速率为慢指针2倍,如存在环则必然双指针必然相交
        while(fast!=slow){
            // 如果快指针能够抵达终点,那么肯定不存在环
            if (fast==null || fast.next==null) return false;
            fast=fast.next.next;
            slow=slow.next;
        }
        return true;
    }

 

posted @ 2021-04-07 11:51  jchen104  阅读(32)  评论(0编辑  收藏  举报