LeetCode 第141题:环形链表

2020-06-22  本文已影响0人  放开那个BUG

1、前言

题目描述

2、思路

这里使用快慢指针的方法解题,慢指针每次移动一步,而快指针每次移动两步。如果列表中不存在环,最终快指针将会最先到达尾部,此时我们可以返回 false。

现在考虑一个环形链表,把慢指针和快指针想象成两个在环形赛道上跑步的运动员(分别称之为慢跑者与快跑者)。而快跑者最终一定会追上慢跑者。这是为什么呢?考虑下面这种情况(记作情况 A)- 假如快跑者只落后慢跑者一步,在下一次迭代中,它们就会分别跑了一步或两步并相遇。

3、代码

public class Solution {
    public boolean hasCycle(ListNode head) {
        ListNode fast = head;
        ListNode slow = head;
        // fast 总是走两步,所以当 fast 为空或者到了最后一个节点时,
        // slow != fast,说明后面都没戏了
        while (fast != null && fast.next != null){
            slow = slow.next;
            fast = fast.next.next;
            if(fast == slow){
                return true;
            }
        }

        return false;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读