环形链表(给定一个链表的头节点 head ,返回链表开始入环的第一个节点)的原理讲解

news/2024/6/16 17:20:10

一:题目

二:原理讲解

解决这个题目 ,我们得先理解它的原理。

1:

首先假设两个指针,一个快指针fast,一个慢指针slow,fast一次移动两个节点,slow一次移动一个节点。(前面的直线代表进入环前面的节点,后面的圆圈就代表入环后的所有节点)

由博主前文环形链表(判断链表中是否有环)的讲解-CSDN博客可知,如果这是一个带环链表,那么二者fast和slow,最后会在环里相遇。 

2:

二者相遇

第一种情况:

此时:我们假设起点到入口点的距离为L,环的周长为C,入口点到相遇点的距离为X。

因为:在截止相遇的那一刻,fast走的距离是slow的两倍。

由上图可知,slow走的距离为L+X,fast走的距离是L+C+X,

所以 2(L+X )= L+C+X,化简可得,L = C - X。

L = C - X是什么意思,意思就是,如果一个点从相遇点开始走(相遇点到入口点的距离是C-X),一个点从起点开始走(起点到入口点的距离是L),他们会在入口点相遇。

这个结论的意义是什么?

意义在于 :入口点就是我们题目要求的入环的第一个节点,而相遇点我们在前文中环形链表(判断链表中是否有环)的讲解-CSDN博客可以轻松得到。

但是这个分析是不完整的。

不完整的原因:

(因为还有第二种情况)

如果L = C - X,由图可知,当环比较小的时候,比如图中的C=4,进环前的节点很多的时候。

L = C - X,在这种情况下不会成立。

3:

完整的分析:

fast走的路程的确是slow 的两倍,但是fast不一定只是L+C+X,在第二种情况我们可以知道,fast应该在slow进入环之前,就已经可能在这个环内走了几圈。

所以正确的表达式应该是:2(L+X )= L+ n * C + X 。 

n代表走的圈数:

由情况1可知,在slow进入环之前,fast在环内走的长度一圈都没有,在slow进入环后,fast开始追赶,最后走了一点距离,追上了slow,此时fast在slow进入环之前在环里走的距离+在slow进入环之后在环里追击所走的距离= 一圈,所以n的最低取值为1。(n≥1)

将2(L+X )= L+ n * C + X ,化简得到:L =  C - X + (N-1) * C。

怎么理解 情况2 的结论:L =  C - X + (N-1) * C  和 情况1: L = C - X  的区别?

情况1:如果一个指针a从相遇点开始走,一个指针b从起点开始走,他们会在入口点相遇。

情况2:如果一个指针a从相遇点开始走,一个指针b从起点开始走,他们会在入口点相遇。

看似两者一致,但是区别在于:

情况1:a指针从相遇点开始走到和b指针在入口点相遇的时候,a指针在环内只走了 C - X,一圈不到的长度。

情况2:a指针从相遇点开始走到和b指针在入口点相遇的时候,a指针在环内走了 C - X + (N-1) * C ,走了N-1圈 ,然后再走了C - X 的长度。

代码展示:

结论:当我们通过快慢指针得到相遇节点,一个指针从相遇节点开始走,一个指针从起点开始走,二者会在环的入口节点相遇。 


http://www.mrgr.cn/p/30245757

相关文章

决策管理中的数学方法

需要注意的是,用excel求解的时候需要导入线性规划加载项如下: pert分析需要DecisionTools中的RiskSolver插件 1.链接:https://pan.baidu.com/s/1wKhUFWgNmQ7U33kl5AypZw 提取码:zqkn 2.“Palisade_Book_expires_Aril_10_2025.lic”文件复制到以下路径: C:\Program Files …

Spring MVC(建立连接 + 请求)

文章目录 一、建立客户端和服务器的连接二、如何构造请求(传参)2.1 构造请求方式 参数通用注解2.2 传递单个参数2.3 传递多个参数2.4 传递数组/集合2.5 传递对象2.6 传递JSON 三、相关的其他请求操作3.1 获取URL中的参数 PathVariable3.2 上传文件 Requ…

ipa 分区算法分析,图解

参考 Room Segmentation: Survey, Implementation, and Analysis. 分区算法调查,实现以及评估对比 相关论文 分区算法 New Brooms Sweep Clean - An Autonomous Robotic Cleaning Assistant for Professional Office Cleaning 形态分割 Interactive SLAM using …

uniapp 小程序图片懒加载组件 ImageLazyLoad

预览图 组件【ImageLazyLoad】代码 <template><viewclass"image-lazy-load":style"{opacity: opacity,borderRadius: borderRadius rpx,background: background,transition: opacity ${time / 1000}s ease-in-out,}":class"image-lazy-loa…

1.分布式-理论

目录 一、什么是分布式系统 二、CAP理论 1.一致性Consisency 2.可用性(Availability) 3.分区容错性(Partition tolrance) 三、BASE理论 1.Basically Available(基本可用) 2.Soft state&#xff08;软状态&#xff09; 3.Eventually consistent&#xff08;最终一致性&a…

当代 Qt 正确的 安装方法 及 多版本切换

此文写于 20240511 首先去网站Index of /official_releases/online_installers下载一个安装器 安装器有什么用? 可以浏览安装版本 安装组件 安装器版本越能 能装的东西越多 现在只能选Qt5 和 Qt6 至于你公司用的Qt4 我也没招 见招时再拆招 安装器 默认国外源 可以换国内…

Bean的作用域和自动装配

Spring Bean的作用域主要有五种Singleton是单例类型,就是在创建起容器时就同时自动创建了一个bean的对象,不管你是否使用,他都存在了,每次获取到的对象都是同一个对象。注意,singleton作用域是Spring中的缺省作用域(默认的作用域)。 prototype是原型类型,它在我们创建容…

从0开始学python(七)

目录 前言 1 break、continue和pass函数 1.1 break 1.2 continue 1.3 pass 2、序列的索引及切片操作 2.1字符串的索引和切片 2.1.1 字符串索引 2.1.2 字符串切片 总结 前言 上一篇文章我们介绍了python中的循环结构&#xff0c;包括for和while的使用。本章接着往下讲。…

Chatgpt的应用场景

文案创作类&#xff1a; 作为一名大型语言模型&#xff0c;ChatGPT可以为使用者提供多种文本处理和文字创作方面的服务&#xff0c;例如&#xff1a; 文本生成和创作 ChatGPT可以基于您提供的主题、关键词或文本段落&#xff0c;生成符合使用者要求的新文本。这些文本可以是文…

跟着ChatGPT学算法-完全背包问题

一、题目 给定 n 个物品,第 i 个物品的重量为 wgt[i-1]、价值为 val[i-1] ,和一个容量为 cap 的背包。每个物品可以重复选取,问在限定背包容量下能放入物品的最大价值。二、和ChatGPT聊聊您 您是一位资深算法工程师,请深入浅出地给出完全背包问题的分析过程和完整带注释的J…

类型注解-Python

师从黑马程序员 类型注解的语法 类型注释的限制 import json import randomvar_1 : int10 var_2 : str"itheima" var_3 : boolTrueclass Student:pass stu :StudentStudent()my_list:list [1,2,3] my_tuple:tuple(1,2,3) my_dict:dict{"itheima":666}my_l…

MySQL5.7安装详细过程--window系统

一:MySQL5.7安装详细过程--window系统1.1、下载MySQL5.7安装包https://downloads.mysql.com/archives/community/1.2、将文件解压到盘符中你可以解压到你想解压的位置,放在C或其他盘符都可以。1.3、配置MySQL的环境变量由于我们下载的不是exe或者msi版本,不能直接双击安装,…

一文学会 Kubernetes Pod 的生命周期管理(转载)

收获 了解 Pod 的状态(Status) 了解 pod 阶段(Phase) 了解 Pod conditions了解容器状态(Status) 保持容器健康了解容器自动重启使用探活(liveness)探针(Probe)检查容器的健康状况如果程序启动缓慢,请使用 startup probeLiveness probe 一些建议 在容器启动和关闭时执…

笨方法自学python(一)

我觉得python和c语言有很多相似之处&#xff0c;如果有c语言基础的话学习python也不是很难。这一系列主要是学习例题来学习python&#xff1b;我用的python版本是3.12 代码编辑器我用的是notepad&#xff0c;运行py程序用cmd 现在开始写第一个程序&#xff1a; print ("…

Rust 解决循环引用

导航 循环引用一、现象二、解决 循环引用 循环引用出现的一个场景就是你指向我&#xff0c;我指向你&#xff0c;导致程序崩溃 解决方式可以通过弱指针&#xff0c;而Rust中的弱指针就是Weak 在Rc中&#xff0c;可以实现&#xff0c;对一个变量&#xff0c;持有多个不可变引…

【谷粒商城】03创建商品模块

1.创建模块 2.创建项目微服务 商品服务、仓储服务、订单服务、优惠券服务、用户服务 共同&#xff1a; 1&#xff09;、web、openfeign 2&#xff09;、每一个服务&#xff0c;包名 com.atguigu.gulimall.xxx(product/order/ware/coupon/member) 3&#xff09;、模块名&#x…

Github的使用教程(下载项目、寻找开源项目和上传项目)

根据『教程』一看就懂&#xff01;Github基础教程_哔哩哔哩_bilibili 整理。 1.项目下载 1&#xff09;直接登录到源码链接页或者通过如下图的搜索 通过编程语言对搜索结果进一步筛选。 如何去找开源项目&#xff1a;(Github 新手够用指南 | 全程演示&个人找项目技巧放…

Django国际化与本地化指南

title: Django国际化与本地化指南 date: 2024/5/12 16:51:04 updated: 2024/5/12 16:51:04 categories:后端开发tags:Django-i18n 本地化-L10n 多语言 国际化 翻译工具 表单验证 性能优化引言 在数字化时代,网站和应用程序必须跨越地域限制,服务于全球用户。这就是国际化(In…

二分图(例题)

https://www.cnblogs.com/kuangbiaopilihu/p/18184536$\quad $ 这里不再介绍二分图的基础知识,只是一些例题的解释。$\quad $ 当然,这道题可以用二分+并查集来解决。但这是二分图专辑,所以介绍一下二分图做法。 $\quad $ 首先如果两个罪犯之间有仇恨,那么当他们不在同一所…

stable diffusion WebUi本地安装

一、stable diffusion 介绍 Stable Diffusion是一种先进的文本到图像的生成模型&#xff0c;它可以根据给定的文本输入生成高度逼真的图像。 Stable Diffusion模型因其高效性和灵活性&#xff0c;在AI图像生成领域引起了广泛关注&#xff0c;并在实际应用中展示了其强大的能力…