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

2024-05-15 03:04

本文主要是介绍链表----带环链表快慢指针进阶版,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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.chinasem.cn/article/990623

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

csu1329(双向链表)

题意:给n个盒子,编号为1到n,四个操作:1、将x盒子移到y的左边;2、将x盒子移到y的右边;3、交换x和y盒子的位置;4、将所有的盒子反过来放。 思路分析:用双向链表解决。每个操作的时间复杂度为O(1),用数组来模拟链表,下面的代码是参考刘老师的标程写的。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#

[MySQL表的增删改查-进阶]

🌈个人主页:努力学编程’ ⛅个人推荐: c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 💻💻💻数据库约束 🔭🔭🔭约束类型 not null: 指示某列不能存储 NULL 值unique: 保证某列的每行必须有唯一的值default: 规定没有给列赋值时的默认值.primary key:

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

Flutter 进阶:绘制加载动画

绘制加载动画:由小圆组成的大圆 1. 定义 LoadingScreen 类2. 实现 _LoadingScreenState 类3. 定义 LoadingPainter 类4. 总结 实现加载动画 我们需要定义两个类:LoadingScreen 和 LoadingPainter。LoadingScreen 负责控制动画的状态,而 LoadingPainter 则负责绘制动画。

深入手撕链表

链表 分类概念单链表增尾插头插插入 删尾删头删删除 查完整实现带头不带头 双向链表初始化增尾插头插插入 删查完整代码 数组 分类 #mermaid-svg-qKD178fTiiaYeKjl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-

建立升序链表

题目1181:遍历链表 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2744 解决:1186 题目描述: 建立一个升序链表并遍历输出。 输入: 输入的每个案例中第一行包括1个整数:n(1<=n<=1000),接下来的一行包括n个整数。 输出: 可能有多组测试数据,对于每组数据, 将n个整数建立升序链表,之后遍历链表并输出。 样例输

从0到1,AI我来了- (7)AI应用-ComfyUI-II(进阶)

上篇comfyUI 入门 ,了解了TA是个啥,这篇,我们通过ComfyUI 及其相关Lora 模型,生成一些更惊艳的图片。这篇主要了解这些内容:         1、哪里获取模型?         2、实践如何画一个美女?         3、附录:               1)相关SD(稳定扩散模型的组成部分)               2)模型放置目录(重要)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点