LeetCode: 141.环形链表|刷题打卡

107 阅读1分钟

一、题目描述

给定一个链表,判断链表中是否有环。
如果链表中存在环,则返回 true 。 否则,返回 false 。
示例:

输入:1->2->3->4->...
输出:true
解释:链表中有个环,其尾部连接到第二个节点

进阶:
你能用 O(1)(即,常量)内存解决此问题吗?

二、思路分析

当两个物体在一个圆形跑道上,向同一方向以不同的速度前进,速度慢的物体一定会被速度快的物体超过整圈的,想一想你在操场上散步,别人再跑步,跑步的是不是会多次从你身边经过?

所以我们用一快一慢的两个指针遍历链表,如果指针能够相遇,那么链表就一定有环。

三、AC 代码

O(1) 内存

var hasCycle = function(head) {
    let p1 = head
    let p2 = head
    while(p1 && p2 && p2.next) {
        p1 = p1.next
        p2 = p2.next.next
        
        if(p1 === p2) {
            return true
        }
    }

    return false
};

四、总结

这个题有点像脑筋急转弯,只要想到如何去判断节点是否被二次读过或指针能二次相遇即可。
该题目也可以使用哈希表对每个链表节点的存储然后来判断是否二次访问该节点来判断是否有环,不过要用到哈希表就不是 O(1) 内存了

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情