每日算法题 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;
    }
}

小舟有话说

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

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

相关推荐
机器人零零壹2 小时前
技术白皮书:iRobotCAM如何解决机器人激光切割应用中的核心难点,从CAD离线编程到双目视觉定位与轨迹自适应提升复杂空间曲线切割的精度、效率与柔性化水平
人工智能·算法
ZhengEnCi5 小时前
大模型的分类到底怎么分:从基础模型到推理模型、从通用到专用的完整图谱
算法
取名真是6 小时前
Python 算法知识点从基础到进阶
开发语言·python·算法
罗西的思考6 小时前
【轻量化复刻大模型 / KIMI K3】KDA 模块交互式演示
人工智能·算法·机器学习
nm_zfyjt8 小时前
信息流广告投放优化实践:线索成本评估模型与转化链路重构(家装建材案例)
算法·重构·内蒙古朋友圈广告服务商·内蒙古朋友圈获客
w_zero_one9 小时前
算法--构造
java·数据结构·算法
其实防守也摸鱼10 小时前
信创安全竞赛知识总结与题库
大数据·网络·人工智能·算法·安全·php
小超人诞生日记11 小时前
C++ 智能指针的使用及其原理详解
c++·算法
lisw0513 小时前
互联网上的数据结构可视化!
数据结构·信息可视化