LeetCode刷题---142. 环形链表 II(双指针-快慢指针)

news2024/11/25 7:07:10

文章目录

  • 一、编程题:142. 环形链表 II(双指针-快慢指针)
      • 1.题目描述
      • 2.示例1:
      • 3.示例2:
      • 4.示例3:
      • 5.提示:
      • 6.提示:
  • 二、解题思路
      • 1.思路
      • 2.复杂度分析:
      • 3.算法图解
  • 三、代码实现
  • 总结


一、编程题:142. 环形链表 II(双指针-快慢指针)

1.题目描述

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

2.示例1:

在这里插入图片描述

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

3.示例2:

在这里插入图片描述

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

4.示例3:

在这里插入图片描述

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

5.提示:

  • 链表中节点的数目范围是 [0, 104]
  • -10^5 <= Node.val <= 10^5
  • pos 为 -1 或者链表中的一个 有效索引 。

6.提示:

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

二、解题思路

  这题可采用快慢指针,其关键点还是该怎么去移动这两个指针?这一点要理清楚。慢指针针每次走一步,快指针每次走两步,如果相遇就说明有环,如果有一个为空说明没有环。然后在有环的基础上需要找出入环的第一个结点,这里就涉及到一些公式推导了。

1.思路

解决方法1(个人想法):

快慢指针第一次相遇:

  • Step 1.创建快慢指针slow和fast,两者初始化均为 head,在运行过程中,slow每次向后走一步,fast每次向后走两步,如果slow==fast时,说明有环返回true;
  • Step 2.当循环正常结束时,说明链表中没有环,即返回false;

当快慢指针第一次相遇(fast==slow)时,可以分析此时fast和slow的移动步数关系:

  • 设链表头结点到环入口的结点个数为a(不计链表入口结点),环内结点个数为b,则从头结点走到环入口结点就会有以下两种情况:
      1、从结点直接走到环入口结点,需要a步即可;
      2、从结点走到环中,然后从环中走到环入口结点(这里可以在环多走几圈),则需要a+k*b(1)(其中k为圈数,k大于等于0的整数值)步即可;
    由上面两种情况可以把链表头结点到环入口所需要的步数归纳为a+k*b步(其中k为圈数,k大于等于0的整数值)
  • 由于slow每次走一步,fast每次走两步,所以可得到DF=2*DS(2);
  • 当fast与slow相遇的时候,快慢指针都走过了a步,然后在环内绕圈直到相遇,此时fast比slow多走了n个环的长度,即DF=DS+n*b(3);结合(2)(3)公式可得 2*DS=DS+n*b,化简得DS=n*b(其中n为圈数);

(注:因为快慢指针之间存在速度差,且差值为1,当链表中存在环时,fast必然与slow相撞,可以画图理解一下)

快慢指针第二次相遇:

  • Step 1.将fast指针指向头结点,与slow进行移动直至相遇(此时fast每次只移动一步),相遇则返回该结点即可;

这里是解决问题的关键,根据之前第一次相遇的fast和slow的步数关系可知道链表头结点到环入口所需要的步数为a+k*b,DS=n*b,这里就可知道当slow指针再移动a步时,就能得到DS=a+n*b,刚好就到达了入口结点,证毕;
综上所述,只要当快慢指针第一次相遇后,只需要把slow再移动a步即可

2.复杂度分析:

时间复杂度: O(N)​,最坏情况为O(N)+O(N),因此总体为线性复杂度O(N)
空间复杂度: O(1)

3.算法图解

红色部分代表快慢指针相撞。(注:本人不会做成流程动画,希望会的朋友可以私信我指点一二,说个软件名字也可以,谢谢

第一次相遇:

请添加图片描述

第二次相遇:

请添加图片描述


三、代码实现

每个代码块都写了注释,方便理解,代码还可以改进;
(根据个人想法编写)

public class Solution {
    public ListNode detectCycle(ListNode head) {
        ListNode slow = head, fast = head;
        while(fast != null && fast.next != null){
            slow = slow.next;
            fast = fast.next.next;
            // 第一次相遇
            if(slow == fast){
                fast = head;
                while(true){
                    // 第二次相遇
                    if(slow == fast) return slow;
                    slow = slow.next;
                    fast = fast.next;
                }
            }
        }
        return null;
    }
}

提交结果:

请添加图片描述


总结

以上就是今天要讲的内容,做题的时候,就是奔着双指针的思路进行解决的,一开始就能写到相遇就说明有环,但没有考虑到相遇之后两个指针的步数关系,所以就卡了好几个小时,但是看了大佬们的题解思路,就豁然开朗了,所以就赶紧记录一下这时刻。

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

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

相关文章

如何理解Linux下一切皆文件

文章目录一、问题抛出二、如何理解三、Linux源码验证一、问题抛出 Linux中普通文件、目录、字符设备、块设备、网络设备等都被当做文件来对待。虽然他们的类型不同&#xff0c;但是Linux中提供了统一的操作接口。  普通文件、目录文件显然非常好理解&#xff0c;因此在本文中&…

今日论文阅读2022-11-10

多模态预训练论文ViLBERT: Pretraining Task-Agnostic Visiolinguistic Representations for Vision-and-Language Tasksvision-and-language tasks&#xff1a; visual question answering,visual commonsense reasoning, referring expressions, and caption-based image ret…

基于DeepLabV3实践路面、桥梁、基建裂缝裂痕分割

在我前面的文章中有基于改进的模型开发的裂缝裂痕检测模型&#xff0c;感兴趣的话可以看下&#xff1a; 《基于yolov5sbifpn实践隧道裂缝裂痕检测》 今天主要是趁着有时间基于deeplabv3来实践裂缝裂痕分割。首先来看效果图&#xff1a; 为了整体直观&#xff0c;这里专门是开…

腾讯蓝鲸 API 网关如何借助 APISIX 实现产品升级与业务完善

分享嘉宾朱雷&#xff0c;腾讯 IEG 运维 PaaS 平台技术负责人。 蓝鲸&#xff08;全名“蓝鲸智云”&#xff09;是一套孵化于腾讯 IEG&#xff08;互动娱乐事业群&#xff09;内部&#xff0c;服务于多业务与各内部平台的研运一体化 PaaS。 其作用是在 CI、CD 和 CO 三个阶段&a…

Spring 概述

Spring是 Java 应用程序开发框架。 Spring 框架的目标是使 J2EE 开发变得更容易使用&#xff0c;通过启用基于 POJO编程模型来促进良好的编程实践。 Spring Framework Spring 基础框架是 Spring Framework &#xff0c;基本上任何其他 Spring 项目都是以 Spring Framework 为…

如何进入 mysql?

目录 1. win r 2. 输入cmd点确定 3. 输入 mysql -u -t 4. 点回车出现 下面的 就代表已经进入 mysql 退出 mysql的 方法&#xff1a; 1. win r 2. 输入cmd点确定 3. 输入 mysql -u -t -u &#xff1a;代表你的用户名&#xff0c;如果是本地登录 则为 -uroot-p &am…

学习python第7天

Python绘制图形库turtle 1.介绍&#xff1a; turtle库根据一组函数指令的控制&#xff0c;在平面坐标系中移动&#xff0c;从 而它爬行的路径上绘制图形。 2.原理&#xff1a;turtle(海龟&#xff09;由程序控制在画布上游走&#xff0c;走过的轨迹形成绘 制的图形&#xff0c…

子不语IPO下限定价:预计2022年全年净利润下滑,华丙如为实控人

11月10日&#xff0c;子不语集团有限公司&#xff08;HK:02420&#xff0c;下称“子不语”&#xff09;在港交所公布发售结果。公告显示&#xff0c;子不语在香港公开发售及国际配售&#xff08;不含基石部分&#xff09;阶段均获得超额认购&#xff0c;将于2022年11月11日在港…

【前端】Vue+Element UI案例:通用后台管理系统-登陆页面Login

文章目录目标代码0.路由1.结构2.校验规则3.样式总代码Login.vue效果本篇很短&#xff0c;因为只有一个页面。没有功能。 目标 登陆页面&#xff0c;路由为/login有表单验证 代码 0.路由 在router的index.js文件中的routes中添加对象&#xff1a; {path:/login,component:L…

SpringBoot+Mybatis+CRUD项目

一、项目要求 创建一个 SpringBoot 项目&#xff0c;项目名”week11_学号”&#xff1b;使用 Mybatis 框架&#xff0c;也可以时可用 MybatisPlus 框架&#xff1b;访问 myschool 数据库&#xff1b;对 student 表进行操作&#xff0c;向 student 插入自己的一条记录&#xff…

Linux学习-29-用户组信息相关命令

8.17 Linux groupadd命令&#xff1a;添加用户组 添加用户组的命令是 groupadd&#xff0c;命令格式如下: [rootCncLucZK ~]# groupadd [选项] 组名选项&#xff1a; -g GID&#xff1a;指定组 ID&#xff1b;-r&#xff1a;创建系统群组。-o 一般与-g选项同时使用&#xff0…

C++ opencv 图像色彩空间转换--色域捕获

1.API和相关知识 1.inRange 在opencv中&#xff0c;我们提取指定色彩范围的区域&#xff0c;采用inRange实现&#xff0c;这样的一块区域&#xff0c;学名叫做ROI&#xff08;region of interest&#xff09;&#xff0c;感兴趣区域。 关于inRange的提取原理 图像中&#xff0…

这是一篇用python画3D爱心的代码

浅浅写一个最近很火的爱心代码 最近你是否也被李峋的爱心跳动代码所感动&#xff0c;心动不如行动&#xff0c;相同的代码很多&#xff0c;我们今天换一个玩法&#xff01;构建一个三维的跳动爱心&#xff01;嗯&#xff01;这篇博客本着开源的思想&#xff01;不是说谁对浪漫…

开放服务担心安全?vx-api-gateway值得一用

下载地址&#xff1a;VX-API-Gateway帮助文档 下载解压打开后 Windows 下vx-api-gateway启动 bin目录下start.bat文件 启动后访问http://localhost:5256/ VX-API客户端用于查看VX-API运行的基本信息,管理应用与API及黑名单,打开客户端的方式,在浏览器中请求http://地址:端口…

被生活、房贷车贷压得喘不过气的35岁测试工程师,拿什么来谈追求~

高龄测试员现状 我有位在深圳工作的测试员朋友分享了他的工作经历&#xff0c;他今年35岁&#xff0c;前不久被公司辞退&#xff0c;面对家庭&#xff0c;房贷&#xff0c;车贷的压力&#xff0c;让他的生活都是一片灰&#xff0c;离职后最让测试员感到痛心是在面试多家公司以…

Android Studio App开发之广播组件Broadcast的讲解及实战(包括收发标准、有序、静态广播实现手机震动功能 附源码)

一、收发标准广播 Android的广播机制正式借鉴了Wifi的通信原理&#xff0c;不必搭建专门的通路&#xff0c;就能在发送方与接收方之间建立连接&#xff0c;同时广播也是Android的四大组件之一&#xff0c;它用于Android各组件之间的灵活通信&#xff0c;与活动的区别在于以下几…

荧光素标记大鼠甲状腺滤泡上皮细胞FRTL-5,荧光素FITC标记的FRTL-5细胞,FITC-FRTL-5

产品名称&#xff1a;荧光素标记大鼠甲状腺滤泡上皮细胞FRTL-5&#xff0c;荧光素FITC标记的FRTL-5细胞 英文名称&#xff1a;FITC-FRTL-5 在F-12培养基中加入5&#xff05;小牛血清、10mU/ml TSH、10g/ml胰岛素、5g/ml转铁蛋白、10ng/ml生长抑素、0.4ng/ml氢化可的松、10ng/…

JAVA虚拟机的性能监控

一、JDK的命令行工具 命令一&#xff1a;jps&#xff08;虚拟机进程状况工具&#xff09; jps -q //只输出LVMID&#xff0c;省略主类的名称&#xff08;LVMID&#xff1a;虚拟机实例运行时候的进程号&#xff09; jps -m //输出虚拟机进程启动的时传递给主类main()函数的参…

笔记本电脑数据怎么恢复?笔记本电脑数据恢复用什么工具?

随着互联网时代的发展&#xff0c;电脑的应用越来越广泛&#xff0c;已经深深融入了我们的工作乃至生活当中。其中&#xff0c;笔记本作为可随身携带的电脑设备&#xff0c;其灵活、轻便等优势一直深受大家喜爱。在日常使用过程中&#xff0c;我们会往笔记本里存储各式各样的数…

Springboot快速开发-书本信息管理系统(项目源码)

【我后续会发一个资源包&#xff0c;里面是所有代码&#xff0c;数据库表设计也有&#xff0c;大学生可以直接用&#xff0c;导入数据库运行&#xff0c;再导入后端项目和前端项目&#xff0c;再去网页运行就好了&#xff0c;效果图下面有】 1、考核要求&#xff1a; 数据库&am…