判断链表中是否带环

题目链接:141. 环形链表 - 力扣(LeetCode)

判断链表里是否带环,我们无法用正常的链表遍历得出

这里使用的算法思想是前后指针

首先我们让slow和fast位于链表头部,slow每次遍历一个,fast每次遍历两个,当slow进入循环点时,fast已经在循环里面。

此时就是典型的追击问题,fast与slow之间的速度差为1,当fast=slow时,链表带环;

那么我们只需考虑循环条件是什么,我们发现,链表带环时,是没有指向null的,因此我们只需要

那么 slow一次走一步,fast走3,4,5...n步,请证明一定能追上吗;

首先我们来看fast走3步的情况

假设环的长度为L;

当slow进环之后,假设slow与fast之间 距离为S,slow与fast之间的速度差为2;

因此,当S为偶数的时候,一定能追上;

当S为奇数时,无法追上,每次S -= 2;当S-1时,此时S=L-1;(错过了,开启了新的一轮追击)

当L-1为偶数时,可以追上;

当L-1为奇数时,则永远无法追上;

总结:S为偶数   ->  第一轮就追上;

S为奇数  ->  L-1为偶数  ->  第二轮追上;

S为奇数  ->  L-1为奇数  ->  永远追不上;

当slow刚进入循环时,fast走的距离是slow的三倍;

因此我们可以列出关系式

我们可以看到,等式左边2C一定是偶数(x表示fast循环了x轮)

根据上述总结,当 S为奇数,L-1为奇数时永远追不上;

带入等式右边,L为偶数(x+1)*L为偶数,S为奇数,偶数-奇数=奇数,

等式左右不成立,所以S为奇数和(L-1)为奇数不能同时存在

真正的总结:根据上次总结得知S为奇数,L-1为奇数时永远不可能追上,但是S和L-1不可能同时为奇数,因此一定能追上

S为偶数  ->  第一轮追上;

S为奇数  ->  第二轮追上;

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值