环形链表 II - LeetCode 热题 26

大家好!我是曾续缘😛

今天是《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;
        }
    }
    

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

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

    相关文章

    docker部署coredns服务器

    创建文件夹 mkdir /coredns/config/添加一个CoreDNS配置文件 cat >/coredns/config/Corefile<<EOF.:53 {forward . 114.114.114.114:53log}EOF启动docker docker run -d --name coredns --restartalways \-v /coredns/config:/etc/coredns \-p 53:53/udp \regist…

    HarmonyOS 开发-短视频切换实现案例

    介绍 短视频切换在应用开发中是一种常见场景&#xff0c;上下滑动可以切换视频&#xff0c;十分方便。本模块基于Swiper组件和Video组件实现短视频切换功能。 效果图预览 使用说明 上下滑动可以切换视频。点击屏幕暂停视频&#xff0c;再次点击继续播放。 实现思路 使用Sw…

    一文了解ERC404协议

    一、ERC404基础讲解 1、什么是ERC404协议 ERC404协议是一种实验性的、混合的ERC20/ERC721实现的&#xff0c;具有原生流动性和碎片化的协议。即该协议可让NFT像代币一样进行拆分交易。是一个图币的互换协议。具有原生流动性和碎片化的协议。 这意味着通过 ERC404 协议&#xf…

    混淆时,编译器优化导致通过反射赋值的类被清空问题

    有几个反射赋值的类&#xff0c;之前一直是 keep 整个class的&#xff0c;现在要求对class的路径进行混淆。 当我启用混淆后&#xff0c;发现整个类的内容被清空了。 // 原始的类内容public class BaseLoadData {property("config_data1")public static String dat…

    R语言数据可视化:ggplot2绘图系统

    ggpolt2绘图系统被称为R语言中最高大上的绘图系统&#xff0c;使用ggplot2绘图系统绘图就像是在使用语法创造句子一样&#xff0c;把数据映射到几何客体的美学属性上。因此使用ggplot2绘图系统的核心函数ggplot来绘图必须具备三个条件&#xff0c;数据data&#xff0c;美学属性…

    如何开始用 C++ 写一个光栅化渲染器?

    光栅化渲染器是计算机图形学中最基础且广泛应用的一种渲染技术&#xff0c;它将三维模型转化为二维图像。下面我们将逐步介绍如何使用C语言从零开始构建一个简单的光栅化渲染器。 一、理解光栅化渲染原理 光栅化是一种将几何数据&#xff08;如点、线、三角形&#xff09;转换…

    视频拍摄后如何用二维码分享?在线制作视频二维码的方法

    现在很多人会将拍摄的视频内容用生成二维码的方式来分享给其他人&#xff0c;与以前使用微信、QQ、网盘等形式相比&#xff0c;二维码能够更加简单快捷的将视频传递给其他人查看&#xff0c;不需要下载缓存占用扫码者的内存&#xff0c;提供更好的用户体验效果。 视频转二维码…

    大语言模型及提示工程在日志分析任务中的应用 | 顶会IWQoS23 ICPC24论文分享

    本文是根据华为技术专家陶仕敏先生在2023 CCF国际AIOps挑战赛决赛暨“大模型时代的AIOps”研讨会闪电论文分享环节上的演讲整理成文。 BigLog&#xff1a;面向统一日志表示的无监督大规模预训练方法 BigLog: Unsupervised Large-scale Pre-training for a Unified Log Represen…

    低代码平台适合谁用?业务岗能用它做什么?开发岗能用它做什么?一文讲清!

    近期&#xff0c;低代码开发平台以其独特的魅力&#xff0c;迅速引发了大众的广泛关注。众多人士纷纷寻求了解各类低代码产品&#xff0c;以探究其功能与特点。 然而&#xff0c;有些人可能因一两款产品的体验不佳&#xff0c;便对整个低代码行业产生了偏见。但我要指出的是&am…

    JS 表单验证

    点击注册的时候&#xff0c;渲染出来&#xff0c;验证码是自动获取出来的 html&#xff1a; <div class"div1">用户名<input type"text" id"yhm"><span id"span1"></span><br>密码<input type"…

    用AI作图,使用这个免费网站,快看我画的大鹏鸟和美女

    还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0c;webgl&#xff0c;ech…

    C语言面试题之判定字符是否唯一

    判定字符是否唯一 实例要求 实现一个算法&#xff0c;确定一个字符串 s 的所有字符是否全都不同 实例分析 1、使用一个大小为 256 的bool数组 charSet 来记录字符是否出现过&#xff1b;2、遍历字符串时&#xff0c;如果字符已经在数组中标记过&#xff0c;则返回 false&a…

    Linux、Docker、Brew、Nginx常用命令

    Linux、Docker、Brew、Nginx常用命令 Linuxvi编辑器文件操作文件夹操作磁盘操作 DockerBrewNginx参考 Linux vi编辑器 Vi有三种模式。命令模式、输入模式、尾行模式&#xff0c;简单的关系如下&#xff1a; i -- 切换到输入模式&#xff0c;在光标当前位置开始输入文本。&a…

    代码随想录算法训练营Day48|LC198 打家劫舍LC213 打家劫舍IILC337 打家劫舍III

    一句话总结&#xff1a;前两题白给&#xff0c;第三题树形DP有点难。 原题链接&#xff1a;198 打家劫舍 滚动数组直接秒了。 class Solution {public int rob(int[] nums) {int n nums.length;int first 0, second nums[0];for (int i 2; i < n; i) {int tmp Math.m…

    SysTick滴答定时器 - 延时函数

    SysTick定时器 Systick定时器&#xff0c;是一个简单的定时器&#xff0c;对于CM3,CM4内核芯片&#xff0c;都有Systick定时器。Systick定时器常用来做延时&#xff0c;或者实时系统的心跳时钟。这样可以节省MCU资源&#xff0c;不用浪费一个定时器。比如UCOS中&#xff0c;分…

    记录一次Ubuntu 22.04桌面版安装向日葵的过程

    大概花了近一天的时间安装了WIN11和Ubuntu 22.04双系统&#xff0c;中间Ubuntu安装时出现了好几次失败&#xff0c;后来检查可能是下载的iso文件有问题&#xff0c;重新下载一次&#xff0c;刻录到U盘。安装才算成功。 最后的Ubuntu系统信息如下 接着安装向日葵的时候出错了&a…

    visionOS 专门应用提交数大幅下降;Kimi 不断「吊打」国内各大厂 AI 模型丨 RTE 开发者日报 Vol.180

    开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」&#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「…

    【六 (3)机器学习-机器学习建模步骤/kaggle房价回归实战】

    目录 文章导航一、确定问题和目标&#xff1a;1、业务需求分析&#xff1a;2、问题定义&#xff1a;3、目标设定&#xff1a;4、数据可行性评估&#xff1a;5、资源评估&#xff1a;6、风险评估&#xff1a; 二、数据收集&#xff1a;1、明确数据需求2、选择数据来源3、考虑数据…

    显示LED屏驱动内置上电复位电路,2线串行接口-VK1640 SOP28 8×16点阵

    产品品牌&#xff1a;永嘉微电/VINKA 产品型号&#xff1a;VK1640 封装形式&#xff1a;SOP2 概述 VK1640是一种数码管或点阵LED驱动控制专用芯片&#xff0c;内部集成有数据锁存器、LED 驱动等电路。SEG脚接LED阳极&#xff0c;GRID脚接LED阴极&#xff0c;可支持8SEGx16GR…

    机器学习之特征选择(Feature Selection)

    1 引言 特征提取和特征选择作为机器学习的重点内容&#xff0c;可以将原始数据转换为更能代表预测模型的潜在问题和特征的过程&#xff0c;可以通过挑选最相关的特征&#xff0c;提取特征和创造特征来实现。要想学习特征选择必然要了解什么是特征提取和特征创造&#xff0c;得…