LC 142. 环形链表 II

news2024/10/7 8:30:53

142. 环形链表 II

给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos-1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。

不允许修改 链表。

示例 1:

输入: head = [3,2,0,-4], pos = 1
输出: 返回索引为 1 的链表节点
解释: 链表中有一个环,其尾部连接到第二个节点。

示例 2:

输入: head = [1,2], pos = 0
输出: 返回索引为 0 的链表节点
解释: 链表中有一个环,其尾部连接到第一个节点。

示例 3:

输入: head = [1], pos = -1
输出: 返回 null
解释: 链表中没有环。

提示:

  • 链表中节点的数目范围在范围 [ 0 , 1 0 4 ] [0, 10^{4}] [0,104]
  • − 1 0 5 < = N o d e . v a l < = 1 0 5 -10^5 <= Node.val <= 10^{5} 105<=Node.val<=105
  • pos 的值为 -1 或者链表中的一个有效索引

进阶: 你是否可以使用 O(1) 空间解决此题?

解法

解法一(哈希表)

思路分析:

  1. 创建一个哈希表hashNode存储链表中的节点
  2. 对链表进行遍历,让出现重复节点时,即为链表开始入环的第一个节点,将其返回即可

实现代码如下:

class Solution {
    public ListNode detectCycle(ListNode head) {
        // 创建哈希表
        HashMap<ListNode, Integer> hashNode = new HashMap<>();
        ListNode cur = head;
        while (cur != null) {
            if (hashNode.containsKey(cur)) {  // 存在节点直接返回
                return cur;
            }
            hashNode.put(cur, 1);
            cur = cur.next;
        }
        return null;
    }
}

提交结果如下:

解答成功:
    执行耗时:3 ms,击败了18.03% 的Java用户
    内存消耗:42.9 MB,击败了14.97% 的Java用户

复杂度分析:

  • 时间复杂度:O(n),遍历一遍链表
  • 空间复杂度:O(n),需要存储链表的节点

解法二(双指针)

思路分析:

  1. 使用两个指针fastslow,起始都位于链表的头部,slow每次向后移动一个位置,fast每次向后移动两个位置,若链表中存在环,则fast指针最终会再次与slow指针在环中相遇
  2. 因为fast每次比slow多走一步,有环,则fast一定会追上slow
  3. 假设链表长度为a+b,即a指链表头部到链表环入口的长度,b为环的长度
    1. fast指针走的步数是slow走的步数的两倍 f = 2 s f = 2s f=2s
    2. fastslow相遇时,两个指针所走长度关系为, f = s + n b f = s + nb f=s+nbnb指的是n圈环的长度
    3. 则有 s = n b s = nb s=nb即两个指针fastslow分别走了2nn个环的周长
  4. 且有链表环的入口点为,从链表头部走 a + n b a+nb a+nb步到达,fastslow相遇时时slow已走过nb步,即只需再走a步,slow指向链表环的入口点
  5. 此时,让一个指针ptr从链表头部开始遍历,且与slow同时移动,当指针ptr走过a步时,指向链表环的入口点,恰好此时指针slow也指向链表环的入口点,即两个指针相遇时,刚好均指向链表环的路口点

实现代码如下:

class Solution {
    public ListNode detectCycle(ListNode head) {
        ListNode fast = head;
        ListNode slow = head;
        // 若fast为空则说明不含有环 退出循环
        while (fast != null && fast.next != null) {
            fast = fast.next.next;
            slow = slow.next;
            if (fast == slow) {        // 当fast与slow相遇
                ListNode ptr = head;
                while (ptr != slow) {    // 寻找环入口处节点
                    slow = slow.next;
                    ptr = ptr.next;
                }
                return ptr;
            }
        }
        return null;
    }
}

提交结果如下:

解答成功:
    执行耗时:0 ms,击败了100.00% 的Java用户
    内存消耗:43 MB,击败了10.51% 的Java用户

复杂度分析:

  • 时间复杂度:O(n),对链表进行遍历
  • 空间复杂度:O(1),使用了常量级变量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1630342.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ ─── 隐式类型转换、static成员、友元、内部类

目录 1. explicit关键字 2. static成员 2.1 概念 2.2 特性 3. 友元 3.1 友元函数 3.2 友元类 4. 内部类 5. 再次理解类和对象 1. explicit关键字 构造函数不仅可以构造与初始化对象&#xff0c;对于接收单个参数的构造函数&#xff0c;还具有类型转换的作用。接收单个…

基因组组装:NextDenovo2 使用大全

简介 NextDenovo 是一种针对长序列读取&#xff08;包括CLR和ONT技术&#xff09;的新型基因组组装工具。它采取了一种“先校正错误再进行组装”的方法&#xff0c;这与canu工具类似&#xff0c;但对于PacBio HiFi读取数据则无需进行校正。相较于其他工具&#xff0c;NextDenov…

使用 Vitepress 构建博客并部署到 github 平台

前言 最近写了好多篇 Chrome 浏览器插件相关的文章&#xff0c;有十几二十篇&#xff0c;就想着构建个博客&#xff0c;用来放置相应的文章。 正好前段时间看到 VitePress 1.0.0 发布了&#xff0c;而且是用 markdown 写文章&#xff0c;正好写插件文章的时候文章都是 md 格式…

达梦数据查询语句不带模式名称,报错无效的表或视图名[某某表]

[执行语句1]: select * from sys_config 执行失败(语句1) -2106: 第2 行附近出现错误: 无效的表或视图名[SYS_CONFIG]1条语句执行失败 解决方案&#xff1a; 保证模式名和用户名一致&#xff0c;而且你当前登录的用户要和模式名一致 把用户换成一样的&#xff0c;查询就可以不 …

如何利用 GPT 自我提高写作能力

GPT革命&#xff1a;如何用AI技术重新定义写作 介绍 在我们的数字时代&#xff0c;了解自我提高写作的必要性至关重要。 随着 GPT 的兴起&#xff0c;我们正在见证书写的变革时代。 这篇扩展文章深入探讨了 GPT 如何显着提高写作技能。 拥抱未来&#xff1a; 人工智能时代的写…

HarmonyOS 应用开发——入门

首先当然是华为的官方文档了&#xff0c;要认真学习: https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V2/start-overview-0000001478061421-V2 不想花时间看&#xff0c;可以看我下面总结的干货&#xff0c;哈哈 第一个问题&#xff1a;stage架构和fa架构的区…

Linux下的常用基本指令

基本指令 前言ls 指令语法功能常用选项举例注意要点关于拼接关于 -a关于文件ls与/的联用ls与根目录ls与任意文件夹ls与常用选项与路径 ls -d与ls -ldls与ll pwd命令语法功能常用选项注意要点window与Linux文件路径的区别家目录 cd 指令语法功能举例注意要点cd路径.. .相对路径与…

【中级软件设计师】上午题12-软件工程(1):软件工程模型、敏捷方法、软件需求、系统设计

上午题12-软件工程&#xff08;1&#xff09; 1 软件过程1.1 CMM 能力成熟度模型1.1 CMMI (建议直接看思维导图&#xff09; 2 软件过程模型2.1 瀑布模型2.2 增量模型2.3 演化模型2.3.1 原型模型2.3.2 螺旋模型 2.5 喷泉模型 3 统一过程&#xff08;UP&#xff09;模型4 敏捷方…

Kafka报错ERROR Exiting Kafka due to fatal exception during startup

报错&#xff1a; ERROR Exiting Kafka due to fatal exception during startup. (kafka.Kafka$) kafka.common.InconsistentClusterIdException: The Cluster ID FSzSO50oTLCRhRnRylihcg doesnt match stored clusterId Some(0oSLohwtQZWbIi73YUMs8g) in meta.properties. Th…

zabbix监控Tongweb7企业版(by lqw+sy)

此贴参考zabbix通过jmx监控Tongweb7企业版&#xff08;by lqw&#xff09;&#xff0c;是在此帖子的基础和同事整理的文档基础上重新部署验证的优化版&#xff0c;使用的是centos7。 优点&#xff1a; 1.不需要通过jmx配置进行监控。&#xff08;jmx配置需要修改tongweb的配置…

鸿蒙开发实战

问题&#xff1a; 1&#xff0c;鸿蒙DevEco Studio 机测试Failure[INSTALL_FAILED_APP_SOURCE_NOT_TRUSTED] 勾选☑️ 勾选自动签名&#xff0c;然后自动跳转登录华为网站&#xff0c;登录即可。 //持续更新&#xff01;

长图高效切割新体验:支持按随机宽度灵活裁切,释放无限创意与效率

图像的传播已经成为我们日常生活的一部分。而长图&#xff0c;作为一种特殊的图像形式&#xff0c;其独特的展示方式能够吸引更多的目光。但是&#xff0c;如何将长图高效切割&#xff0c;以展现其独特的魅力呢&#xff1f;现在&#xff0c;我们为您带来了一款支持按随机宽度切…

Leetcode-17.04. 消失的数字

面试题 17.04. 消失的数字 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/missing-number-lcci/ 目录 面试题 17.04. 消失的数字 - 力扣&#xff08;LeetCode&#xff09; 题目 解题(注释) 第一种方法 第二种方法 第三种方法 题目 数组nums包含…

快速集成xxljbo

目录 1.下载工程 2.docker集成admin 1.拉取镜像 2.启动xxl-job 3.访问 3.配置测试 1.添加依赖 2.配置yml文件 3.添加配置类

【Linux系统编程】基础指令(三)

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

CLI举例:基于用户接入方式和终端设备类型的安全策略

组网需求 如图1所示&#xff0c;某企业在网络边界处部署了FW作为安全网关&#xff0c;连接内部网络与Internet。具体情况如下&#xff1a; 内部网络中已经部署了Agile Controller身份验证机制&#xff0c;Agile Controller服务器上存储了用户信息。内部网络中的用户可以使用不…

网络攻击日益猖獗,安全防护刻不容缓

“正在排队登录”、“账号登录异常”、“断线重连”......伴随着社交软件用户的一声声抱怨&#xff0c;某知名社交软件的服务器在更新上线2小时后&#xff0c;遭遇DDoS攻击&#xff0c;导致用户无法正常登录。在紧急维护几小时后&#xff0c;这款软件才恢复正常登录的情况。 这…

65、二分-在排序数组中查找元素的第一个和最后一个位置

思路&#xff1a; 寻找数组中的目标值第一个和最后一个&#xff0c;如果不存在哪儿就是返回-1。 第一种方式直接线性遍历&#xff0c;找到目标值记录当前下标。继续寻找下一个不等于目标值&#xff0c;说明下一个目标值的下标就是结尾。直接返回。 第二种方式通过使用二分法…

双系统下删除ubuntu

絮絮叨叨 由于我在安装Ubuntu的时候没有自定义安装位置&#xff0c;而是使用与window共存的方式让Ubuntu自己选择安装位置&#xff0c;导致卸载时我不知道去格式化哪个分区&#xff0c;查阅多方资料后无果&#xff0c;后在大佬帮助下找到解决方案 解决步骤 1、 插上Ubuntu安…

【Python】控制语句

1、运用python的控制语句if elif else 2、回顾输入输出函数的使用 3、使用random函数得到随机数 4、运用python的循环语句 5、熟悉了埃筛法找素数 6、练习了数组和参数传递 1、从键盘接收整数的一百分制成绩(0~100),要求输出其对应的成绩等级A~E。其中,90分(包含)以上为A,…