环形链表 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;}
    }
    

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

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

    相关文章

    每日OJ题_两个数组dp④_力扣44. 通配符匹配

    目录 力扣44. 通配符匹配 解析代码 力扣44. 通配符匹配 44. 通配符匹配 难度 困难 给你一个输入字符串 (s) 和一个字符模式 (p) &#xff0c;请你实现一个支持 ? 和 * 匹配规则的通配符匹配&#xff1a; ? 可以匹配任何单个字符。* 可以匹配任意字符序列&#xff08;包…

    全面了解网络性能监测:从哪些方面进行监测?

    目录 摘要 引言 CPU内存监控 磁盘监控 网络监控 GPU监控 帧率监控 总结 摘要 本文介绍了网络性能监测的重要性&#xff0c;并详细介绍了一款名为克魔助手的应用开发工具&#xff0c;该工具提供了丰富的性能监控功能&#xff0c;包括CPU、内存、磁盘、网络等指标的实时…

    [C语言]——柔性数组

    目录 一.柔性数组的特点 二.柔性数组的使用 三.柔性数组的优势 C99中&#xff0c;结构体中的最后⼀个元素允许是未知大小的数组&#xff0c;这就叫做『柔性数组』成员。 typedef struct st_type //typedef可以不写 { int i;int a[0];//柔性数组成员 }type_a; 有些编译器会…

    B. Burning Midnight Oil Codeforces Round 112 (Div. 2)

    题目链接&#xff1a; Problem - 165B - Codeforceshttps://codeforces.com/problemset/problem/165/B 题目大意&#xff1a; 最后写了至少n个&#xff0c;每次衰减k倍&#xff08;/k&#xff09;&#xff0c;问最初的v最小为多少。 思路&方法&#xff1a; 二分答案。 AC代…

    2024零废弃日青山少年可持续工坊走进南湖社区

    “零废弃”不代表完全不产生任何垃圾&#xff0c;而是一种“尽可能避免产生废弃”的生活态度&#xff0c;每一个人都可以从零开始&#xff0c;从日常的随手小事开始&#xff0c;珍惜每一件物品、珍视每一种情绪&#xff0c;为生活腾出更大的空间。 2024零废弃日&#xff0c;北…

    JS 表单验证

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

    《Git版本控制管理》笔记

    第三章 起步 git --version查看版本号git --help查看帮助文档裸双破折号分离参数 git diff -w master origin – tools/Makefile将当前目录或任何目录转化为Git版本库 git init 初始化之后项目目录中&#xff0c;有名为.git的文件git status 查看git状态git commit 提供日志消…

    贪心算法|135.分发糖果

    力扣题目链接 class Solution { public:int candy(vector<int>& ratings) {vector<int> candyVec(ratings.size(), 1);// 从前向后for (int i 1; i < ratings.size(); i) {if (ratings[i] > ratings[i - 1]) candyVec[i] candyVec[i - 1] 1;}// 从后…

    格式化字符串漏洞原理及其利用(附带pwn例题讲解)

    写在前面&#xff1a; 本篇博客为本人原创&#xff0c;但非首发&#xff0c;首发在先知社区 原文链接&#xff1a; https://xz.aliyun.com/t/14253?time__1311mqmx9QiQi%3D0%3DDQoDsNOfptD8nDCFdNNK4D&alichlgrefhttps%3A%2F%2Fxz.aliyun.com%2Fu%2F74789各位师傅有兴趣…

    JQuery(三)---【使用JQuery动态设置浏览器窗口尺寸、JQuery的遍历】

    零.前言 JQuery(一)---【JQuery简介、安装、初步使用、各种事件】-CSDN博客 JQuery(二)---【使用JQuery对HTML、CSS进行操作】-CSDN博客 一.JQuery动态设置浏览器窗口尺寸大小 1.1width()和height()方法 width()&#xff1a;设置或者返回元素的宽度(不包括内边距、边框或外…

    React - 你知道在React组件的哪个阶段发送Ajax最合适吗

    难度级别:中级及以上 提问概率:65% 如果求职者被问到了这个问题,那么只是单纯的回答在哪个阶段发送Ajax请求恐怕是不够全面的。最好是先详细描述React组件都有哪些生命周期,最后再回过头来点题作答,为什么应该在这个阶段发送Ajax请求。那…

    智慧校园预付费水电表控制系统

    在智慧校园建设中&#xff0c;预付费水电表控制系统成为了不可或缺的一部分&#xff0c;它采用了先进的信息技术手段确保校园水电资源的高效管理和使用。这种系统通过智能化、信息化的手段&#xff0c;不仅优化了能源管理&#xff0c;还大幅提升了校园管理的现代化水平。本文将…

    FPGA(Verilog)实现uart传输协议传输数据(含仿真)

    目录 实现功能&#xff1a; 1.接收uart串行数据&#xff0c;输出并行数据(1byte)。 2.输入并行数据(1byte)&#xff0c;输出uart串行数据。 3.完成uart传输的1次环回。 uart协议的1帧数据传输 模块封装-port设置 Verilog代码实现 1.uart接收模块:接收串行数据,输出并行数…

    开源区块链系统/技术 总结(欢迎补充,最新)

    1. FISCO BCOS FISCO BCOS 2.0 技术文档 — FISCO BCOS 2.0 v2.9.0 文档https://fisco-bcos-documentation.readthedocs.io/ 2. ChainMaker&#xff08;长安链&#xff09; 文档导航 — chainmaker-docs v2.3.2 documentationhttps://docs.chainmaker.org.cn/v2.3.2/html/in…

    Java事件处理机制

    一、介绍 java事件处理是采取“委派事件模型”。当事件发生时&#xff0c;产生事件的对象&#xff0c;会把此“信息”传递给"事件的监听者"处理&#xff0c;这里所说的"信息"实际上就是java.awt.event事件类库里某个类所创建的对象&#xff0c;把它称为&q…

    以XX大学学生公寓为例的安科瑞远程抄表与配电能效系统解决方案【AcrelEMS-EDU校园综合能效管理】

    建设背景 随着我国经济的高速发展&#xff0c;建筑能耗特别是国家机关办公建筑和大型公共建筑高耗能的问题日益突出。学校作为大型公共机构建筑的重要组成部分之一&#xff0c;其特点是占地面积大、建筑分布广、数量多、类型多样、用能情况复杂&#xff1b; 高校用能普遍问题…

    【linux】拓展知识-linux图形界面(GUI 程序)、X11介绍

    linux图形界面 Linux 本身是没有图形化界面的&#xff0c;linux只是一个基于命令行的操作系统&#xff0c;所谓的图形化界面系统只不过中 Linux 下的应用程序。没有图形界面linux还是linux&#xff0c;很多装linux的WEB服务器就根本不装X服务器。 这一点和 Windows 不一样。W…

    Linux C柔性数组(零长数组)

    零长数组&#xff0c;大小为0&#xff0c;一般用在结构体中&#xff08;网络通信&#xff0c;省流&#xff09;&#xff0c;节省空间&#xff0c;方便善后&#xff08;相对于指针类型&#xff09;&#xff0c;我们通过具体例子进行理解。 常规定长数组 #include <stdio.h&…

    【机器学习】深入解析机器学习基础

    在本篇深入探讨中&#xff0c;我们将揭开机器学习背后的基础原理&#xff0c;这不仅包括其数学框架&#xff0c;更涵盖了从实际应用到理论探索的全方位视角。机器学习作为数据科学的重要分支&#xff0c;其力量来源于算法的能力&#xff0c;这些算法能够从数据中学习并做出预测…

    CentOS下部署ftp服务

    要在linux部署ftp服务首先需要安装vsftpd服务 yum install vsftpd -y 安装完成后需要启动vsftpd服务 systemctl start vsftpd 为了能够访问ftp的端口&#xff0c;需要在防火墙中开启ftp的端口21&#xff0c;否则在使用ftp连接的时候会报错No route to host. 执行如下命令为f…