LeetCode题练习与总结:环形链表Ⅱ--142

一、题目描述

给定一个链表的头节点  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, 10^4] 内
  • -10^5 <= Node.val <= 10^5
  • pos 的值为 -1 或者链表中的一个有效索引

二、解题思路

这个问题是著名的“链表环入口”问题,可以使用“快慢指针”的解法来解决。以下是详细的解题步骤:

  1. 初始化两个指针,一个快指针(fast)和一个慢指针(slow),它们都从链表的头节点开始移动。

  2. 移动快慢指针,快指针每次移动两步,慢指针每次移动一步。

  3. 检查是否有环,如果快指针和慢指针相遇,则说明链表存在环。

  4. 寻找环的入口,当快慢指针相遇后,将其中一个指针(例如慢指针)移动到链表的头节点,另一个指针保持在相遇点。然后,两个指针以相同的速度移动,当它们再次相遇时,所在的位置就是环的入口。

  5. 返回结果,如果链表无环,则返回 null;如果有环,则返回环的入口节点。

三、具体代码

public class Solution {
    public ListNode detectCycle(ListNode head) {
        ListNode fast = head;
        ListNode slow = head;
        boolean hasCycle = false;

        // 检查是否有环
        while (fast != null && fast.next != null) {
            fast = fast.next.next;
            slow = slow.next;
            if (fast == slow) {
                hasCycle = true;
                break;
            }
        }

        // 如果没有环,返回 null
        if (!hasCycle) {
            return null;
        }

        // 寻找环的入口
        slow = head;
        while (slow != fast) {
            slow = slow.next;
            fast = fast.next;
        }

        return slow; // 返回环的入口节点
    }
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 检查是否有环的阶段

    • 初始化两个指针,一个快指针(每次移动两步)和一个慢指针(每次移动一步)。
    • 假设链表总长度为 L,非环部分长度为 a,环部分长度为 b。
    • 在没有遇到环的情况下,快指针和慢指针最多移动 L 步,即 L = a + b。
    • 当快慢指针都进入环中后,它们会在环中相遇。设它们在环中相遇前,快指针比慢指针多走了 n 步,则有 n = b。
    • 快慢指针相遇时,它们分别走了 a + b 和 a + b - n 步,即快指针走了 L 步,慢指针走了 L - n 步。
    • 由于快指针走的步数是慢指针的两倍,所以有 2(L - n) = L,解得 n = L/2。
    • 因此,慢指针在环中走了 L/2 步,快指针走了 L 步,它们相遇的时间复杂度为 O(L)。
  • 寻找环的入口的阶段

    • 将慢指针移回链表头部,快指针保持在相遇点。
    • 由于慢指针在环中已经走了 L/2 步,且快指针在相遇点,所以它们相遇时,慢指针走了 a 步,快指针走了 a + b 步。
    • 因此,它们相遇的时间复杂度为 O(a)。

综上所述,总的时间复杂度为 O(L)。

2. 空间复杂度
  • 该算法只使用了几个指针变量,没有使用额外的数据结构。
  • 因此,空间复杂度为 O(1)。

五、总结知识点

  1. 链表操作:代码中涉及到链表的基本操作,包括遍历链表、判断节点是否为空、移动指针等。

  2. 快慢指针技巧:这是解决链表相关问题的一种常用技巧,通过设置两个指针,一个快一个慢,来解决问题。在本题中,快指针每次移动两步,慢指针每次移动一步,用于检测链表中是否存在环。

  3. 循环检测:通过快慢指针的相遇来判断链表中是否存在环。如果快慢指针相遇,则说明链表中有环;如果快指针遇到空节点,则说明链表中无环。

  4. 数学推理:当快慢指针在环中相遇时,通过数学推理可以得出慢指针走过的距离和环的入口之间的关系,从而找到环的入口。

  5. 边界条件处理:代码中需要处理链表为空或者链表没有环的情况,这需要仔细考虑边界条件,确保代码的鲁棒性。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【鸿蒙学习笔记】位置设置

官方文档&#xff1a;位置设置 目录标题 align&#xff1a;子元素的对齐方式direction&#xff1a;官方文档没懂&#xff0c;看图理解吧 align&#xff1a;子元素的对齐方式 Stack() {Text(TopStart)}.width(90%).height(50).backgroundColor(0xFFE4C4).align(Alignment.TopS…

数据分析的线上云端数据库搭建及Excel和Tableau连接

数据分析的线上云端数据库搭建及Excel和Tableau连接 SQL基础知识 线上SQL训练&#xff1a; SQlZOO: https://www.sqlzoo.net/wiki/SQL_Tutorial 牛客网SQL真题&#xff1a;https://www.nowcoder.com/ta/sql select,from,where, order by, limit, group by, having, substr(),…

windows 本地ES 7.11.0 版本集群搭建

1.先下载JDK &#xff0c;建议下载JDK11. 2.下载ES Windows安装包 7.11.0下载 3.下载完成后&#xff0c;在本地解压三份&#xff0c;分别取名 node1,node2,node3 4.若启动一直报端口占用&#xff0c;这修改 每个文件夹下bin/elasticsearch.bat文件&#xff0c;没有则跳过 在…

MySQL高级-MVCC- readview介绍

文章目录 1、介绍2、ReadView中包含了四个核心字段&#xff1a;3、版本链数据的访问规则&#xff1a;4、不同的隔离级别&#xff0c;生成ReadView的时机不同&#xff1a; 1、介绍 ReadView&#xff08;读视图&#xff09;是 快照读 SQL执行时MVCC提取数据的依据&#xff0c;记录…

基于bootstrap的12种登录注册页面模板

基于bootstrap的12种登录注册页面模板&#xff0c;分三种类型&#xff0c;默认简单的登录和注册&#xff0c;带背景图片的登录和注册&#xff0c;支持弹窗的登录和注册页面html下载。 微信扫码下载

[Redis]主从模式

启动主从复制 由于我们只有一台机器&#xff0c;所以我们只能在机器上开多个redis程序来演示不同的机器 因为一个端口号只能被一个进程绑定&#xff0c;所以我们需要修改配置&#xff0c;绑定不同的端口号&#xff0c;并且还要修改工作目录&#xff08;数据持久化的位置&#…

第二天:ALOAM前端讲解【第1部分】

第二天:ALOAM前端讲解 目标: 熟悉 ALOAM基本原理与代码框架,快速熟悉代码ALOAM效果 内容: LOAM论文论文精讲整体代码框架介绍前端特征提取,点到线、点到面ICP代码讲解ALOAM精讲 一、ALOAM整体架构 LOAM主要包含两个模块,一个是Lidar Odometry,即使用激光雷达做里程计计…

Qt项目天气预报(8) - 绘制温度曲线 + 回车搜索(最终篇)

全部内容在专栏&#xff1a; Qt项目 天气预报_mx_jun的博客-CSDN博客 目录 绘制温度曲线 事件过滤器在子控件上绘图 子控件下载事件过滤器 事件过滤器进行绘图 - eventFilter 画初步高温曲线 画初步低温曲线 效果演示 画低温曲线 画高温曲线 效果演示 按下回车搜索: …

ETAS工具导入DEXT生成Dcm及Dem模块(二)

文章目录 前言DcmDcmDsdDcmDslDcmDspDcmPageBufferCfgDem报错解决总结前言 之前一篇文章介绍了导入DEXT之后在cfggen之前的更改,cfggen完成之后,就可以生成dcm,dem的配置了,但生成完配置后,如果直接生成BSW代码,会报错。本文介绍在cfggen完成后,生成BSW代码前的修改 Dc…

Go环境安装---附带每一步截图

Windows环境 Go安装包下载 下载后直接安装步骤按照即可。 测试 winR 输入cmd 在命令行输出go version可以看到自己的版本。 go env 查看环境变量 在桌面创建hello.go的文件 编写代码。注意&#xff0c;编码必修是UTF-8 在命令行输入路径刚刚代码所在的路径&#x…

【从零开始学架构 架构基础】三 架构设计的复杂度来源:高可用复杂度来源

架构设计的复杂度来源其实就是架构设计要解决的问题&#xff0c;主要有如下几个&#xff1a;高性能、高可用、可扩展、低成本、安全、规模。复杂度的关键&#xff0c;就是新旧技术之间不是完全的替代关系&#xff0c;有交叉&#xff0c;有各自的特点&#xff0c;所以才需要具体…

tomcat8.5在windows下运行出现日志中文乱码

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; h…

八月份的护网行动如何参加?

护网行动背景 什么是“护网行动”&#xff1f; 指挥机构∶由公安机关统一组织的"网络安全实战攻防演习"。 护网分为两级演习∶公安部对总部&#xff0c;省厅对省级公司。 什么是“实战攻防演习” 每支队伍3-5 人组成&#xff0c;明确目标系统&#xff0c;不限制攻…

SerDes介绍以及原语使用介绍(4)ISERDESE2原语仿真

文章目录 前言一、iserdese2_module模块二、oserdese2_module模块三、顶层模块四、仿真结果分析 前言 上文详细介绍了ISERDESE2原语的使用&#xff0c;本文根据仿真对ISERDESE2原语的使用进一步加深印象。在仿真时&#xff0c;与OSERDESE进行回环。 一、iserdese2_module模块…

【C语言】指针剖析(2)

©作者:末央&#xff06; ©系列:C语言初阶(适合小白入门) ©说明:以凡人之笔墨&#xff0c;书写未来之大梦 目录 一、数组名1.概念2.sizeof和&里面的数组名sizeof& 二、使用指针访问数组三、一维数组传参本质四、指针数组1.概念实例&#xff08;模拟二维数…

C语言中常用的运算符、表达式和语句

C语言是一种通用的、高级的编程语言&#xff0c;其历史可以追溯到20世纪60年代末至70年代初。C语言最初是由丹尼斯里奇&#xff08;Dennis Ritchie&#xff09;在贝尔实验室为开发UNIX操作系统而设计的。它继承了许多B语言的特性&#xff0c;而B语言则是由迷糊老师&#xff08;…

C#基于SkiaSharp实现印章管理(3)

本系列第一篇文章中创建的基本框架限定了印章形状为矩形&#xff0c;但常用的印章有方形、圆形等多种形状&#xff0c;本文调整程序以支持定义并显示矩形、圆角矩形、圆形、椭圆等4种形式的印章背景形状。   定义印章背景形状枚举类型&#xff0c;矩形、圆形、椭圆相关的尺寸…

springboot宠物医院管理系统-计算机毕业设计源码07221

目 录 1 绪论 1.1 选题背景和意义 1.2国内外研究现状 1.3论文结构与章节安排 2 宠物医院管理系统系统分析 2.1 可行性分析 2.1.1技术可行性分析 2.1.2 操作可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分…

docker配置国内镜像加速器

1、搜索阿里云 2、搜索容器镜像服务 点击管理控制台 配置镜像加速器

uniapp部署服务器,uniapp打包H5部署服务器,uniapp将config.js抽离

目录 步骤一.在static文件夹下新建config.js文件 config.js文件说明 在config.js中放入使用的请求的接口地址,资源路径等 congfig.js中的变量在页面中如何使用 步骤二.manifest.json配置 1.在项目根目录(与app.vue同级)创建template.h5.html文件 2.在manifest.json配置刚刚创…