【LeetCode】环形链表II+结论证明

news2024/10/7 15:22:41

题目链接:环形链表II

题目:给定一个链表的头节点  head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null

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

示例1:

示例2:


  •  解题过程 
  1. 判断链表是否环
  2. 如有环,找到入环口的节点.

判断是否有环我已经在这一节讲过了【LeetCode】环形链表+结论证明,大家可以先去看看,这一节主要讲解如何找到入环口,与推导过程。

  • 找到入环口思路

如已知道链表已经有环,那么接下来要找这个环的入口了,我们定义一个从头结点出发的指针,从链表相遇节点也同时出发一个指针,这两个指针每次移动一个节点, 那么当这两个指针相遇的时候就是环形入口的节点

struct ListNode *detectCycle(struct ListNode *head) {
    struct ListNode* fast = head;
    struct ListNode* show = head;
    while(fast&&fast->next)
    {
         fast = fast->next->next;
         show = show->next; 
        if(fast == show)
        { 
            //那为什么两个指针会在入环点相遇呢?
            struct ListNode* index1  = fast;
            struct ListNode* index2  = head;
            while(index1 != index2)
            {
                index1 = index1->next;
                index2 = index2->next;  
            }
            return index1;// 返回环的入口
        }
    }
    return NULL;
}

  • 不少人在刚开始做这题时都会有这样的疑惑,为什么两个指针会在入环点相遇呢?
  • 接下来我们就推导证明一下.

 有的人是这样推导的:

 fast走的路程是slow的两倍

假设:

链表头节点--入环口节点的距离为-> L.

入环口节点--相遇节点距离为-> X

环的长度为->C

slow指针走的路程是: L+X  分析:(有没有可能slow进环转了几圈才追上? 答案是:不可能,肯定是在一圈之内,fast指针必然会追上slow指针,因为他们之间距离每次缩小1,不会错过,slow走一圈,fast都走了两圈了,肯定追的上.)

fast指针走的路程是:L+X+C

推导:

2*(L+X) = L+C+X   (慢指针走的路程两倍 等于 快指针的路程)

L + X = C  (两边同时约定一个L+X)

L = C - X    (环的距离 - 节点相遇距离 = 入环口)


该推论是错误的!!如果下面环长这样呢?

 所以上面的推论只是在个别情况是正确的,那该如何推导呢?

假设:

链表头节点--入环口节点的距离为-> L.

环的长度为->C

入环口节点--相遇节点距离为-> X

 fast 走的路程是: L+N*C + X

( 假设N是slow进环前,fast在环里面转的圈数 )

 推导:

 2(L+X) = L+N*C + X

 (两边同时约掉L+X)

 L+X = N*C

 L = N*C-X 

所以入环点是 fast在环里面转的圈数-相遇节点距离

这也证明了从头结点出发一个指针,从相遇节点同时也出发一个指针,这两个指针每次移动一个节点, 当两指针相遇时就是 环形入口的节点

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

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

相关文章

Grafana系列-统一展示-7-ElasticSearch数据源

系列文章 Grafana 系列文章 ElasticSearch 数据源 Grafana内置了对Elasticsearch的支持。你可以进行多种类型的查询,以可视化存储在Elasticsearch中的日志或指标,并使用存储在Elasticsearch中的日志事件对图表进行注释。 配置 ES 数据源 关键的几项…

在两道多线程基础题“顺序打印”中对比一下Java中的wait()和join()

目录 一、基础 二、进阶 一、基础 有三个线程,线程名称分别为:a,b,c,每个线程打印自己的名称。 需要让他们同时启动,并按 c,b,a的顺序打印。 这道题要求打印 cba,且只打…

开发中proc文件系统的简单使用

使用proc文件系统 文章目录 使用proc文件系统1.meminfo文件2. free命令3、创建 /proc 节点4、使用 file_operations 实现 proc 文件读写 导向内核信息5、使用 seq_file 实现 proc 文件的读取 在Linux系统中, “/proc”文件系统十分有用, 它被内核用于向用…

可视化图表API格式要求有哪些?Sugar BI详细代码示例(4)

Sugar BI中的每个图表可以对应一个数据 API,用户浏览报表时,选定一定的过滤条件,点击「查询」按钮将会通过 API 拉取相应的数据;前面说过,为了确保用户数据的安全性,Sugar BI上的所有数据请求都在Sugar BI的…

进击数据基础设施新蓝海,厂商如何“择木而栖”?

文 | 螳螂观察 作者 | 李永华 多样的应用需求,倒逼底层存储能力不断升级; 复杂的数据状况,要求存储能够“兼容并蓄”; 客户企业在数字化方面的战略转型升级,总是触及到存储…… 当数据基础设施成为新的蓝海&#…

大学计算机基础-题库刷题-精选

题库刷题: 写在前面: 这个是我准备应对学校转专业考试而刷的题库, 也是大学计算机的题库,同样适用于大学计算机这门课的期末考试。 精选了一些重要的题目。 目录 题库刷题: 写在前面: 题目1&#x…

内卷时代,大厂产品经理仅用3步破局

本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注"慕课网"! 作者:申悦|慕课网讲师 在当下互联网环境下,产品经理究竟要如何破局? 我认为,既然要破局…

RocketMQ学习笔记:生产者Producer

DefaultMQProducer 根据上文:RocketMQ学习笔记:消息Message - 掘金 (juejin.cn),我们定位到Producer中的这一行代码: java 复制代码 DefaultMQProducer producer new DefaultMQProducer("ProducerGroupName"); pro…

2023年3月GESP能力等级认证C++一级真题

一、单选题(每题2分,共30分) 1.以下不属于计算机输入设备的有(B )。(2分) A.键盘 B.音箱 C.鼠标 D.传感器 2.计算机系统中存储的基本单位用 B 来表示,它…

Git 常用命令笔记

下载安装这里就不赘述了,直接下一步就行! 一、常用命令 1. 增加删除/文件 添加当前目录的所有文件到暂存区 git add .添加指定文件到暂存区 git add [file1] [file2] ...添加指定目录到暂存区,包括子目录 git add [dir]对于同一个文件的多…

多种方法解决There is no tracking information for the current branch的错误

文章目录 1. 复现错误2. 分析错误3. 解决错误3.1 远程有分支3.2 远程无分支 4. 总结 1. 复现错误 今天发布某版本的项目,准备创建个v0point1分支,后期如果修改该版本,直接在该分支上修改即可。 首先,使用git branch v0point1命令…

问道游戏私人服务器架设+详细搭建教程+外网教程

搭建条件: 1、服务器一台, 2、下载服务端 搭建教程: 1.先安装宝塔 2、放行安全组的相应端口 具体要放行的端口有:3306、888、8888、5000、8101、8110、8120、8160-8168(这个是范围之8160是一线,依次类推) 3、安装数据库…

别点了!CAS登录对接,这个Bug让你反复登录!

目录 引言 背景描述 问题描述 问题排查 软件测试工程师发展规划路线 引言 你是否曾经在登录一个网站时,不断输入账号密码,却发现自己总是无法成功登录?或者你是否曾经遇到过跨域问题导致的登录失败? 今天我要和大家分享的就…

Speech and Language Processing之神经网络

上面这句话很好的解释了一件事,就是“大力出奇迹” ,当神经元的数目足够足够多的时候,机器所能做到的事情就很复杂、很难理解了,这是不是说明chatgpt的成功也是因为大? 现代神经网络是一个由小型计算单元组成的网络&am…

前端 Web 性能清单

💂 个人网站:【海拥】【摸鱼游戏】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 想寻找共同学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 提高 Web 应用程序的性…

HS6621系列低功耗国产蓝牙芯片 支持蓝牙5.1

HS6621CxC是一个功耗优化的蓝牙低功耗和专有的2.4 ghz应用真正的芯片上系统(SOC)解决方案。它集成了一个具有蓝牙基带和丰富外设的低功耗射频收发器I0扩展。HS6621CxC还集成了电源管理,提供高效率电源管理。它的目标是2.4 G蓝牙低功耗系统,人机界面设备(…

尚无忧【已对接硬件】共享自习室,共享麻将馆,共享茶室,共享空间,共享台球室,共享健身房无人值thinkphp开发

1、定位功能:可定位附近是否有店 2、能通过关键字搜索现有的店铺 3、个性轮播图展示,系统公告消息提醒 4、个性化功能展示,智能排序,距离、价格排序 5、现有店铺清单展示,订房可查看房间单价,根据日期、…

面试了一位6年的软件测试,一问三不知,他还反怼我...

最近看了很多简历,很多候选人年限不小,但是做的都是一些非常传统的项目,想着也不能通过简历就直接否定一个人,何况现在大环境越来 越难,大家找工作也不容易,于是就打算见一见。 在沟通中发现,由…

linux 修改 /etc/locale.conf无效问题处理办法

问题背景: 我在做测试系统文档转换成其他格式文档时,按照系统要求配置系统的编码格式为:utf-8 但是 尤其是设置:LC_ALLZh_CN.UTF- 8 但是 即使 我已经设置了 /etc/locale.conf内容如下: 并且source /etc/locale.con…

【FPGA-DSP】第十期:sysgen算法封装与调用

参考视频教程第10期 - sysgen算法封装与调用 - 基于FPGA的数字信号处理系统开发笔记_哔哩哔哩_bilibili 该教程主要实现如何将sysgen编写的算法模块给实际的应用起来 添加封装有两种方式: 在Vivado中使用ip核添加算法模块封装在Sysgen中将算法模块封装 Sysgen开发…