环形链表 II - LeetCode 热题 26

news2024/12/23 17:49:13

大家好!我是曾续缘😛

今天是《LeetCode 热题 100》系列

发车第 26 天

链表第 5 题

❤️点赞 👍 收藏 ⭐再看,养成习惯

环形链表 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, 104]
    • -105 <= Node.val <= 105
    • pos 的值为 -1 或者链表中的一个有效索引

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

    难度:💖💖

    解题方法

    寻找链表中环的入口节点

    这道题需要找到链表中环的入口节点,我们同样可以使用快慢指针的算法来解决。

    假设从链表头部到环的入口有 a a a 个节点,环中有 b b b 个节点。一个指针要走到入口处,其走过的步数 k k k 满足 k = a + n × b k = a + n \times b k=a+n×b 的数学关系。这意味着要么直接走 a a a 步到达入口,要么先走到入口然后绕环 n n n 圈回到入口。

    通过快慢指针可以检测链表是否存在环。当快慢指针相遇时,假设快指针走过的步数为 f f f,慢指针走过的步数为 s s s,则有以下关系:

    1. 快指针速度是慢指针的两倍,即 f = 2 × s f = 2 \times s f=2×s
    2. 快慢指针在环内相遇,快指针比慢指针多走了 n n n 圈,因此 f = s + n × b f = s + n \times b f=s+n×b

    通过上述方程组,我们得到重要的信息: s = n × b s = n \times b s=n×b,这意味着什么呢?

    当快慢指针相遇时,慢指针走过的步数是环节点数的整数倍!

    为了使慢指针到达环的入口,即满足 k = a + n × b k = a + n \times b k=a+n×b,只需让慢指针再走 a a a 步即可,或者继续多走几圈再返回。

    然而, a a a 是未知数,我们并不知道具体需要走多少步,该怎么办呢?

    a a a 表示链表头部到链表入口的节点数,我们可以将快指针置于链表头部,与慢指针速度相同。当它们再次相遇时,它们之间的距离差就是链表头部到链表入口的节点数,因此我们也就获得了 a a a,慢指针正好满足入口公式的条件。

    过程如下:

    1. 首先设定两个指针 slow 和 fast,初始化它们都指向头节点。
    2. 使用一个 do…while 循环,循环内部判断快指针和快指针的下一个节点是否为空,如果有一个为空,则说明链表无环,直接返回 null。
    3. 在循环内部,快指针每次向前移动两步,慢指针每次向前移动一步,直到它们相遇。
    4. 当快指针和慢指针相遇时,将快指针重新指向头节点,并将快指针和慢指针都以每次一步的速度向前移动。
    5. 当快指针和慢指针再次相遇时,相遇的节点即为环的入口节点。

    Code

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    public class Solution {
        public ListNode detectCycle(ListNode head) {
            if (head == null) {
                return null;
            }
            ListNode slow = head, fast = head;
            do {
                if (fast == null || fast.next == null) {
                    return null;
                }
                fast = fast.next.next;
                slow = slow.next;
            } while (fast != slow);
            fast = head;
            while (fast != slow) {
                fast = fast.next;
                slow = slow.next;
            }
            return fast;
        }
    }
    

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

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

    相关文章

    linux特殊引号

    可见引号的不同&#xff0c;可以实现对不同内容的引用以及解析

    近50位科技企业大咖齐聚共探出海之道,中国企业出海应该怎么卷?

    4月2日下午&#xff0c;由中国云产业联盟暨中关村云计算产业联盟&#xff08;简称“云联盟”&#xff09;组织召开的“科技企业出海经验分享”专题闭门研讨会成功召开&#xff0c;云联盟执行会长兼秘书长龚梅&#xff0c;云联盟副秘书长、汉能投资董事总经理赵兰洋以及来自中国…

    若依自带vue-cropper上传图片(可旋转、缩放)

    2024.4.4今天我学习了如何使用若依的vue-cropper上传图片组件&#xff0c;在工作中遇到一个需求&#xff0c;需要对上传的图片进行旋转的操作&#xff0c;然后我先找到el-upload组件&#xff0c;使用之后发现它有一个自动上传和非自动上传的功能&#xff0c;是不是就可以通过非…

    二:深入理解 JAVA 内存模型 JMM

    目录 1、为什么要有内存模型1.1、为什么要有多级缓存&#xff1f;1.2、缓存一致性问题1.3、处理器优化和指令重排 2、并发编程的三大问题2.1、原子性问题2.2、有序性问题2.3、可见性问题2.4、三大特性 3、什么是内存模型&#xff1f;3.1、概念3.2、内存模型到底是怎么保证缓存一…

    自动驾驶基础技术-无迹卡尔曼滤波UKF

    自动驾驶基础技术-无迹卡尔曼滤波UKF Unscented Kalman Filter是解决非线性卡尔曼滤波的另一种思路&#xff0c;它利用Unscented Transform来解决概率分布非线性变换的问题。UnScented Kalman Filter不需要像Extended Kalman Filter一样计算Jacobin矩阵&#xff0c;在计算量大…

    LeetCode-热题100:K 个一组翻转链表

    题目描述 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节…

    在一台恢复测试机器上验证oracle备份有效性

    一 目的 定期将生产环境oracle数据库恢复到一台测试环境数据库服务器上&#xff0c;以验证备份是否有效&#xff0c;是否能正常恢复。 二 环境 这里以恢复orcl1库为例&#xff0c;计划在orcl这个实例上进行恢复测试。 三 实验步骤 3.1 在目标端创建和源端一样的备份目录 ①…

    从零开始写 Docker(十)---实现 mydocker logs 查看容器日志

    本文为从零开始写 Docker 系列第十篇&#xff0c;实现类似 docker logs 的功能&#xff0c;使得我们能够查查看容器日志。 完整代码见&#xff1a;https://github.com/lixd/mydocker 欢迎 Star 推荐阅读以下文章对 docker 基本实现有一个大致认识&#xff1a; 核心原理&#x…

    51单片机之自己配串口寄存器实现波特率9600

    本配置是根据手册进行开发配置的 1、首先配置SCON 所以综上所诉 SCON 0x40 &#xff08;0100 0000&#xff09; 2、PCON不用配置 3、配置定时器1 4、波特率的计算 5、配置AUXR 6、对比 7、实现 8、优化&#xff08;实现字符串&#xff09; 引入TI &#xff08;智能延时&…

    加州大学欧文分校英语基础语法专项课程03:Simple Past Tense 学习笔记(完结)

    Learn English: Beginning Grammar Specialization Specialization Certificate course 3&#xff1a; Simple Past Tense Course Certificate 本文是学习 https://www.coursera.org/learn/simple-past-tense 这门课的学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。…

    Java基础笔记(一)

    一、面向对象高级基础 1.Java的动态绑定机制 public class DynamicBinding {public static void main(String[] args) {//a 的编译类型 A, 运行类型 BA a new B();//向上转型System.out.println(a.sum());//40 子类sum()注释后-> 30System.out.println(a.sum1());//30 子类…

    STM32无刷电机全套开发资料(源码、原理图、PCB工程及说明文档)

    目录 1、原理图、PCB、BOOM表 2、设计描述 2.1 前言 2.2 设计电路规范 3、代码 4、资料清单 资料下载地址&#xff1a;STM32无刷电机全套开发资料(源码、原理图、PCB工程及说明文档) 1、原理图、PCB、BOOM表 2、设计描述 2.1 前言 经过一个星期的画PCB&#xff0c;今…

    上传应用程序到苹果应用商店的工具和要点

    引言 在今天的移动应用市场中&#xff0c;将应用程序上传到苹果应用商店&#xff08;App Store&#xff09;是许多开发者的首要任务之一。然而&#xff0c;不同操作系统下的开发者可能需要使用不同的工具和遵循不同的要求来完成这一任务。本文将介绍在 macOS、Windows 和 Linu…

    day75 js 正则表达式 window对象轮播图片调用定时器

    一 正则表达式: RegExp 对象: 对字符串执行模式匹配的强大工具。 1 创建正则表达式对象 let reg /模式/修饰符 修饰符 attributes 是一个可选的字符串&#xff0c;包含属性 "g"、"i" 和 "m"&#xff0c; …

    kmeans聚类sklearn实现(Python实验)

    Kmeans毫无疑问&#xff0c;好用又“便宜”的算法&#xff0c;经常在很多轻量化场景中实现。所谓的“聚类”&#xff08;Clustering&#xff09;&#xff0c;就是通过欧氏距离找哪些点构成一个簇。假设我们空间中有一堆点&#xff0c;通过肉眼大概可以看出有两簇&#xff0c;思…

    rman 物理误删除的整库恢复

    故障模拟: 有备份情况下,物理删除了 rm -rf /oraback/* 下的所有文件1 环境准备 备份 rman target / log/oraback/rmanbak/0_rmanbak.log <<EOF run{ delete noprompt backup; allocate channel c1 type disk maxpiecesize 1000M; allocate channel c2 type disk max…

    java实战基础------一文搞定maven

    &#x1f388;个人主页&#xff1a;靓仔很忙i &#x1f4bb;B 站主页&#xff1a;&#x1f449;B站&#x1f448; &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;JAVA实战基础 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处…

    什么是SD NAND?

    文章目录 前言一、SD NAND 简介二、CS创世 SD NAND 的六点优势三、CS创世 SD NAND 相较于其它存储产品的优缺点四、结语 前言 本文转自 雷龙官网 一、SD NAND 简介 什么是CS创世 SD NAND呢&#xff1f;很多的朋友一直想知道这个问题。今天我们雷龙也精心准备了SD NAND 的一个介…

    程序员搞副业对自身有提升吗?

    一、程序员如何搞副业 程序员利用自身技能开展副业的方式有很多&#xff0c;以下是一些常见的选择&#xff1a; 1. 开发独立软件或APP&#xff1a;如果你有独特的创意或者发现市场上存在某种需求&#xff0c;可以开发独立的软件或手机应用&#xff0c;并通过广告、付费下载或内…

    云测了解记录

    1.app、web、接口&#xff0c;一般通过特定的录制工具&#xff0c;录制后可在云测平台执行。平台可查看自动执行的过程&#xff0c;生成测试报告等 2.app真机实测 选择机型&#xff0c;类似手机模拟器&#xff0c;可安装app&#xff0c;以及模拟各种操作。实现特定机型bug复现…