【LeetCode】day15 142.环形链表II

news/2025/2/8 21:13:36 标签: leetcode, 链表, 算法

142. 环形链表 II - 力扣(LeetCode)

题目描述

给定一个链表的头节点  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
    解释:链表中没有环。

    题解

    这道题我在做的时候感觉相当之抽象啊,我看了题解之后也理解了一段时间才明白。

    这道题分为两个部分,首先我们要判断有无环,其次判断环的入口在哪 

    判断有无环

    设置两个指针,一个快指针,一个慢指针。快指针每次走两步,慢指针每次走一步。如果链表中存在环,那么快指针一定会和慢指针相遇。如果链表中不存在环,那么快指针一定会先指向空

    为什么存在环,两个指针就一定会相遇?

    举一个形象的比喻,跑800米,如果两个同学一快一慢同时跑,那么跑的快的同学一定会先领先于跑的慢的同学,然后再追赶上跑的慢的同学。

    怎么确定两个指针不会错开?

    两个同学在奔跑时不会是闪现对吧,距离的移动是连续的,所以肯定不会错开。

    快指针一次移动两步,慢指针一次移动一步,相当于慢指针静止,快指针以一步的速度追慢指针,而一个节点的距离已经算是链表中单位距离,所以两个指针一定会相遇

    判断环的入口

     

    1.slow为什么等于x+y 即为什么slow不是转了很多圈之后和fast遇上?

    如图,slow进入入口到再进入入口的期间,fast肯定已经追上过它了


    2.n为什么>=1

    很好理解啊 跑的快的同学在追上跑的慢的同学之前起码已经跑完了一圈


    3.重点在于理解x=(n-1)(y+z)+z 这个等式

    y+z是一圈的长度 如果两个指针分别从起点和相遇点同时移动,每个都一个节点的速度向前移动,两个指针一定会在圈的入口处相遇

    当n=1时,很好理解,就是慢指针要进入环内时,快指针刚好走了一圈回到环的入口。

    当n不等于1时,那就相当于快指针转了很多圈+z,最后都会在环的入口处相遇

    所以我要找到环的入口,就让两个指针分别指向链表的头和相遇点,同向移动,最终一定能在环的入口内相遇

    class Solution {
    public:
        ListNode *detectCycle(ListNode *head) {
           ListNode*fast=head,*slow=head;
           while(fast&&fast->next){ //不用判断慢指针,快指针肯定走在慢指针前面,如果是非循环链表
            fast=fast->next->next;
            slow=slow->next;
            //两个指针相遇,找到相遇点
            if(slow==fast){
                 ListNode*index1=fast,*index2=head;
                 while(index1!=index2){
                    index1=index1->next;
                    index2=index2->next;
                 }
                 return index1;
            }
           }
           return NULL;
        }
    };


    http://www.niftyadmin.cn/n/5845291.html

    相关文章

    还搞不透stm32单片机启动过程?一篇文章几百字让你彻底看懂!

    1.stm32启动 1.1 msp和pc的初始值,第一步: 2.boot的值就被锁定了 可以根据实际绑定的值变动, 这里补充一点boot1和0的原理: 1.2来点刺激的: 这里我插入一个链接: 【明解STM32】一文搞明白STM32芯片存储…

    2025年Android NDK超全版本下载地址

    Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分…

    备考蓝桥杯嵌入式4:使用LCD显示我们捕捉的PWM波

    上一篇博客我们提到了定时器产生PWM波,现在,我们尝试的想要捕获我们的PWM波,测量它的频率,我们应该怎么做呢?答案还是回到我们的定时器上。 我们知道,定时器是一个高级的秒表(参考笔者的比喻&a…

    【Linux网络编程】谈谈网络编程中的select、poll、epoll、Reactor、Proactor模型(下)

    本文目录 一、IO多路复用第二版(epoll)二、epoll三大核心接口1、epoll_create()2、epoll_ctl()3、epoll_wait()4、epoll简单实例5、epoll的ET模式和LT模式6、epoll内核实现 三、异步IO四、Linux惊群效应与c10K问题五、主流网络模型介绍1、基于Thread-bas…

    quartus24.1版本子模块因时钟问题无法综合通过,FPGA过OOC问题复盘

    因为只负责一个子模块,所以需要单独对该子模块进行综合和过OOC,这时候已经有一些加虚拟pin文件,敲命令让子模块能过OOC的方法。但这个方法的前提是先过综合,然后再敲命令让虚拟管脚命令成功,最终可以过OOC。 今天负责…

    【电商系统架构的深度剖析与技术选型】

    以下是对电商系统架构的深度剖析与技术选型: 一、电商系统架构剖析 整体架构 前台系统:是用户直接交互的部分,包括用户界面、商品展示、购物车、订单结算等模块。需注重用户体验,确保页面设计美观、商品信息清晰、购物流程简便。…

    荣耀内置的远程控制怎样用?荣耀如何远程控制其他品牌的手机?

    荣耀手机没有内置的远程控制功能,倒是有一项内置的【远程守护】功能,可以共享定位。如果家里的老人、小孩都使用荣耀手机,那么可以共享定位,随时知道人在哪,避免走丢。 荣耀手机【远程守护】功能的使用步骤&#xff1a…

    A2DP/HFP音频蓝牙模块+玩具,开启儿童成长智能时代

    音频蓝牙模组在玩具中的应用非常常见,特别是在需要音频互动、音乐播放或语音功能的玩具中。 一、应用场景 1. 音乐播放玩具:玩具通过蓝牙连接主设备(如手机或平板),播放存储在主设备中的音乐或音效。 2. 语音互动玩具:玩具可以…