链表----带环链表快慢指针进阶版

1.带环链表及其拓展

(1)这个题目组要就是进行判断这个链表是否带环,使用的是布尔类型作为返回值;

(2)我们这里的思路是使用的快慢指针,快指针一次走2步,慢指针一次走1步,如果这个过程中两个指针会相遇,那么我们就可以说明这个链表是带环的,否则就是不带环的;

(3)可能有些同学就会问,难道这个过程他们两个快慢指针就一定会相遇吗?这个当在快指针一次走两步的情况下,这个是一定会相遇的,为什么这么说呢?因为当慢指针进行环之后,每次快指针都会比慢指针多走一步,假设慢指针进入环的时候,两者之间的距离是L,每走一步,两者之间的距离就会减少一个单位长度,这个样的话,他们两个指针迟早是会相遇的;

(4)这个题目本身可能并不是非常难,但是在这个题目的基础之上,面试官还会更加深入的进行提问:这个我们设计的快指针是一次走两个单位,如果一次走3个,一次走4个单位长度,又会是什么样的结果呢?

我们使用的判断依据就是一个快指针,一个慢指针,快指针先进入环(在有环的前提下面),慢指针后进入环,这个过程中快慢指针就会进行追击,是否一定可以追上呢?这个有何哪些因素相关呢?实际上这个和环上面的元素的个数以及初始情况下快慢指针的相差的个数有关;

(5)下面我们讨论一下当fast一次走3个单位长度的时候,会不会相遇,在什么情况下相遇?

上面的就是一个基本的情况,我们的慢指针进入环的时候,快指针就已经在环里面走过很长的一段距离了,这个时候我们假设快指针和慢指针之间的距离是n,因为在这个情况线面我们的快指针是一次走3步,慢指针一次走1步,这个时候,我们的快指针每次都会比慢指针多走2步,每次都是两步两步的进行追击,我们在这个情况下面能不能追上就和n的救星有关了;

因为如果这个n是偶数,每次快指针都比慢指针多走两步,那么最后一定是可以追上的,但是如果n是奇数,每次减少2个单位长度,最后就是相差的5,3,1相差到1个单位长度的时候,我们的快指针已经马上可以追上慢指针了,但是因为快指针每次都会比慢指针多走2步,这个时候就会错过,出现的结果就是快指针跑到了慢指针的前面,之后他们的差距就会增加,展开新一轮的追击;

到这个时候,你千万不要以为两个错过之后就结束了,就再也不会相遇了,因为这个时候快指针还是走得快,这个一段时间之后他们两个还是会相遇的,这个情况我们还是要继续进行分析的;

这个时候我们定义一个新的变量就是C,这个C代表的就是环上面的元素的个数,或者说是节点的个数,因为当快指针还差一个单位长度追上慢指针的时候,就会出现快指针一次比慢指针走2步,从而实现超越,这个时候两者之间相差的元素的个数就是n-1了,这个时候展开新一轮的追击,每次快指针还是比慢指针多走两步,当这个n-1是偶数,也就是说n是奇数的时候,两步两步的进行追击,最后是可以追上的,但是当n-1还是奇数的时候,就会出现又会错过的情况,这个时候之后就永远都不会追上了(因为最后的时候还是马上就要追上的时候实现超越,两者之间还是相差n-1个元素);

(6)针对上面的分析,我们进行总结一下:当快指针一次走3步的时候,就会因为两个之间相差的元素的个数出现不同的情况,

一种就是n是偶数,这样的话两步两步的追最后就可以追上了;

但是当n是奇数的时候,我们就要重新对于情况进行划分:我们重新定义c作为这个环上面的元素的个数,当c-1是偶数的时候,第二轮可以追上的,但是当c-1是奇数的时候,最后就永远追不上了;

总的来讲:n是奇数,c是偶数的时候,就会永远追不上;

(7)当快指针一次走4步,我们快指针每次都比慢指针多走3个单位长度,我们就要判断这个之间的元素n的情况,我们这个时候就不是按照奇偶性进行讨论,而是看这个n和3之间的关系,从而进行对应的判断,这里只会更加复杂,但是分析的方法同上,这里不再赘述,感兴趣的小伙伴可自行进行讨论;

(8)永远追不上的条件分析:我们以快指针一次走3步作为例子,我们通过这个快指针的路程是慢指针的3被作为等量关系列式

上面的就是我们进行分析的过程:n还是慢指针进环的时候,快慢指针之间相差的元素个数,L指的是进环之前的路程,我们分别表示出来开始到慢指针进环快慢指针走过的路程,利用之间的3被作为等量关系列示求解;

上面我们是以慢指针进环的时候两者之间的3被关系作为关系的,实际上这个过程中快指针始终是慢指针的3被,我们只是选取了慢指针进入环的这个时刻进行分析罢了;

慢指针走的路程就是L,我们假设fast在慢指针进入环之前就已经走了x圈,这个时候我们表示出来快指针走过的路程,利用3倍关系进行计算,最后的出来这个等式2*L=(x+1)*C-n;

我们上面就已经讨论过,n是奇数,C是偶数的时候永远不会相遇,我们带入就可以发现,2*L肯定是奇数,因为C是奇数(x+1)*C肯定是偶数,偶数-n是偶数,当n是奇数的时候这个等式肯定是不成立的,所以我们发现,我们上面讨论的那个永远不会相遇的情况是不满足这个等式的。

(9)这个时候,你还清醒吗?就是我们通过理论的分析,发现当n是奇数,c是偶数的时候,就会永远错过;

但是我们的快慢指针走的路程满足3倍关系,我们推理出来一个等式,我们的n奇数,c偶数根本不会满足这个等式,就说明我们的n奇数c偶数根本就不存在,因此这个当快指针一次走3个单位长度的时候,不会出现永远错过的情况,一定会相遇,这个就是我们通过上面的严谨的证明过程想要得出的结论。

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

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

相关文章

iOS Xcode 升级Xcode15报错: SDK does not contain ‘libarclite

一 iOS Xcode 升级Xcode15报错: SDK does not contain libarclite 1.1 报错信息 SDK does not contain libarclite at the path /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/ lib/arc/libarclite_iphonesimulator.a; try increasin…

Sass(Syntactically Awesome Stylesheets)是一种强大的CSS预处理器

Sass(Syntactically Awesome Stylesheets)是一种强大的CSS预处理器,它旨在简化CSS的编写,并增强其功能。它让开发者能够使用变量、嵌套规则、混入(mixins)、继承等高级功能,从而编写更加结构化和…

Linux基础知识面试题

1. 请描述Linux操作系统的安装过程,并说明其中的关键步骤。 Linux操作系统的安装过程通常涉及以下几个关键步骤: 准备安装介质:需要从官网或者其他可靠来源下载Linux发行版的ISO镜像文件,并制作一个启动U盘或者烧录到DVD中。现在…

基于 LlaMA 3 + LangGraph 在windows本地部署大模型 (九)

LlaMA 3 系列博客 基于 LlaMA 3 + LangGraph 在windows本地部署大模型 (一) 基于 LlaMA 3 + LangGraph 在windows本地部署大模型 (二) 基于 LlaMA 3 + LangGraph 在windows本地部署大模型 (三) 基于 LlaMA 3 + LangGraph 在windows本地部署大模型 (四) 基于 LlaMA…

Java面向对象——多态

即同一个方法可以根据发送对象的不同而采用多种不同的行为方式。 一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多(父类,有关系的类)。 多态存在的条件: 1. 有继承关系; 2. 子类重写父类…

linux 卸载Nginx

在Linux中卸载Nginx,通常涉及几个关键步骤,包括停止Nginx服务、卸载依赖库、删除文件和清理安装包。具体的命令可能因Linux发行版的不同而略有差异。以下是一个通用的卸载流程: 1、停止Nginx服务 在卸载Nginx之前,需要先停止Ngi…

思维导图软件哪个好?5个软件教你自己快速制作思维导图

思维导图软件哪个好?5个软件教你自己快速制作思维导图 思维导图软件在现代生活和工作中扮演着重要的角色,它们可以帮助人们整理思维、规划项目、记录笔记等。以下是五款值得推荐的思维导图软件,它们各有特色,可以帮助您快速制作思…

嵌入式Linux:编译和使用Protobuf库

目录 1、开发环境和工具 2、安装和编译Protobuf、Protobuf-C库 3、编写和编译proto文件 4、修改makefile文件 5、测试示例 6、参考资料 Protobuf(Protocol Buffers)是由 Google 开发的一种轻量级、高效的结构化数据序列化方式,用于在不同应用…

Java红黑树详解及示例

红黑树(Red-Black Tree)是一种自平衡的二叉查找树(Binary Search Tree),它确保了在最坏情况下基本操作(比如插入、删除、查找)都能在O(log n)时间内完成。红黑树的关键在于它在每个节点上存储了…

Charger之三动态电源路径管理(DPPM)

-----本文简介----- 主要内容包括: 领资料:点下方↓名片关注回复:粉丝群 硬件之路学习笔记公众号 Charger的动态电源路径管理(DPPM) 前篇内容:①电池管理IC(Charger)了解一下&…

python中几种推导式简单样例

目录 一、python中几种推导式 1.1 列表推导式: 1.2 字典推导式 1.3 生成器表达式: 1.4 条件表达式: 二、简化对多个列表的并行迭代函数: 一、python中几种推导式 1.1 列表推导式: 使用列表推导式可以简化对列表…

基于java 自定义注解Annotation设计简单ORM框架——进阶篇

目录 引言实例新建两个注解标注实体类拼接sql语句 总结 引言 一般Java规范编程(只是一种习惯,而不是强制)中,变量的命名方式一般采用驼峰式命名。比如userName,userImage。但是在数据库中一般不会采用驼峰式&#xff…

AIGC、LLM 加持下的地图特征笔记内容生产系统架构设计

文章目录 背景构建自动化内容生产平台系统架构设计架构详细设计流程介绍笔记来源笔记抓取干预 笔记 AIGC 赋能笔记 Rule 改写笔记特征库构建 附录Bash Cron 定时任务Golang 与 Pyhon AIGC 实践 小结 背景 在大模型的浪潮下,ChatGPT、Sora、Gemini、文言一心 等新技…

js sleep 实现方式

在JavaScript中,由于其单线程和事件驱动的特性,没有直接的sleep函数,但你可以通过一些方法模拟出类似的效果。最常见的方式是使用setTimeout或者setInterval,以及更现代的Promise和async/await语法来实现异步等待。下面是几种实现…

[MRCTF2020]PixelShooter

是个安卓游戏题 re手肯定不会去玩游戏,先jadx分析一波 没有什么关键信息,但找到了一个unity类,想到apk也可以解压缩得到 .so 或者 Assembly-CSharp.dll 故又在dnspy分析一下 看了半天没有和flag有关信息,看wp: Asse…

知识付费系统开源方案,教育机构如何利用朋友圈做转介绍?

招生成本高,效果差让许多教育机构头疼不已。对于教育机构来说通过转介绍招生是一个非常有效的途径,那么教育机构如何利用朋友圈做转介绍呢?今天小编就来和大家分享一下。 利用朋友圈做转介绍,主要是通过做活动,来完成增加粉丝、扩…

用面向对象的思想编写实时嵌入式C程序

实时嵌入式系统的软件一般由C语言编写,程序结构基本上都是这样的: // 主程序 int main(void) {init(); // 初始化while(1){tick(); // 业务逻辑}return 0; }// 计时器 static unsigned int g_timer_tick_cnt 0; // 时钟中断回调 void isr_time…

【工作篇】软件工程师的知识基础(持续更新)

目录 1. linux 知识篇 1. linux 知识篇 1. Linux API 是什么 Linux API 是指 Linux 操作系统 提供的应用程序接口,用于与操作系统进行交互。它包含了一系列的函数、系统调用、库函数和数据结构,用于实现各种系统级的操作,如文件操作、进程…

C++ 练习题四道 hv-LDM

1.判断两个日期间的天数 class test { public:int y, m, d, x;test(){y 2023, m 3, d 1, x 3;}test(int yy, int mm, int dd){y yy;m mm;d dd;}void ReturnWeekDay(){int iWeek 0;int Y 0, C 0, M 0, D 0;if (m 1 || m 2){C (y - 1) / 100;Y (y - 1) % 100;M …

HTML常用标签-布局相关标签

布局标签 div标签 俗称"块",主要用于划分页面结构,做页面布局 自己独占一行的元素&#xff0c;设置宽高生效 span标签 俗称"层",主要用于划分元素范围,配合CSS做页面元素样式的修饰 不会自己独占一行的元素&#xff0c;设置宽高不生效 代码 <div style&…