每日算法题 14---14.环形链表

题目

14.环形链表

要求

给你一个链表的头节点 head ,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。

注意:pos 不作为参数进行传递。仅仅是为了标识链表的实际情况。

如果链表中存在环 ,则返回 true 。 否则,返回 false

示例

思路1(快慢指针)

我们定义两个指针,一快一满,慢指针每次只移动一步,而快指针每次移动两步,如果该链表快慢指针永远不相遇,那么说明这个链表中不存在环,如果某个时刻快慢指针相遇,那说明该链表存在环。相遇的原理就类似于两个人在环形操场上跑步,一快一慢,不管怎么样一直跑下去总会有相遇的一刻;但如果在直行路上走路,一快一慢注定不会相遇(前提是慢起点在快起点后面)

时间复杂度为O(N)、空间复杂度为O(1) (只用到了两个指针的空间)

我们根据这个原理来实现环的确认

代码1

java 复制代码
public class Solution {
    public boolean hasCycle(ListNode head) {
        if(head==null || head.next==null){
            return false;
        }
        ListNode slow=head;
        ListNode fast=head.next;
        while(slow!=fast){
            if(fast==null||fast.next==null){
                return false;
            }
            slow=slow.next;
            fast=fast.next.next;
        }
        return true;
    }
}

思路2(哈希表)

我们可以利用哈希表的性质来查看环是否存在,每次遍历一个节点时,如果该节点已经存在哈希表里,则说明这个链表中有环,反之将该节点加入哈希表,重复这个过程,知道我们遍历完整个链表

注意我们这次用HashSet,HashSet和HashMap的区别在于前者专门用于存储唯一元素的集合,不需要存键值对,后者是可以用来存储元素出现次数,需要存键值对,在这道题中我们只需要判断该节点是否存在过,因此用前者比较合适

时间复杂度为O(N)、空间复杂度为O(N)(主要为哈希表的开销)

代码2

java 复制代码
public class Solution {
    public boolean hasCycle(ListNode head) {
        Set<ListNode> seen = new HashSet<ListNode>();
        while (head != null) {
            if (!seen.add(head)) {
                return true;
            }
            head = head.next;
        }
        return false;
    }
}

小舟有话说

这道题也可以用来练习链表,加深对链表的认识

如果觉得这两个思路有帮助到你,可以点个关注哦~

相关推荐
小玮看世界1 小时前
[Python]OD算法在OD实际运用转化参考清单
开发语言·python·算法
黎阳之光1 小时前
数字孪生赋能全域水网,实现水资源管控与节水降碳双向提升
人工智能·物联网·算法·安全·数字孪生
随意起个昵称1 小时前
【BFS】冰面滑行
算法·宽度优先
(Charon)2 小时前
【C++】定时器进阶:使用最小堆管理定时任务
c++·算法
hansang_IR2 小时前
【题解】 [省选联考 2021 A/B 卷] 卡牌游戏
c++·算法
这个DBA有点耶3 小时前
COUNT慢不是因为用了*,是这5个原因——1000万行数据实测+执行计划深度解析
数据库·mysql·算法
贾伟康3 小时前
【口算王|01】HarmonyOS ArkTS 口算题生成实战:按年级、运算类型和难度生成可控题目
算法·harmonyos·arkts·随机生成·口算题
lzx_0023 小时前
C++11(一)
开发语言·c++·算法
529宝宝起名网3 小时前
用 Python 实现名字寓意评分算法:基于 NLP 语义分析的名字内涵深度评估
python·算法·自然语言处理
带多刺的玫瑰4 小时前
Leecode#26刷题之删除有序数组中的重复项
数据结构·算法·leetcode