环形链表中的环判断(快慢指针版)与(缘分)

1 篇文章 0 订阅
1 篇文章 0 订阅

        解决一个问题,需要严谨的数学逻辑以及思维的推理过程  ,我们今天分享的 环形链表中的环判断(快慢指针版)就能感受到其中的思维美。

       什么事带环的链表,简单来说就是成一个循环的链表,但又不是双向链表,如图。

ok,相信你已经有了比较清晰的认识。u那你如何解呢?

       误区:一般人会想着去求链表的长度,注意一旦带环我们就求不出其长度,你可以想链表无限循环下去,它的长度是无穷。

       本题要运用的方法就是双指针法,也就是追及问题

如图,我们设立快慢指针,让slow走一步,fast走二步。

有些小伙伴问为什么不让slow,fast随便走,只要fast比slow快就行

其实,这个问题可以通过推理验证!,我们先以

1,slow走一步,fast走二步为例。fast先进环,过一会,slow也进环,假设此时slow与fast之间距离为N,则每追一次,距离减少一,那当距离为0时,则追上了。

2,slow走1步,fast走3步,则每追击一次,距离减少2;我们要分奇偶数讨论,当N为偶数时,为0时追上了,当N为奇数时,就为-1了,我们设环度为C,-1意味着他们之间的距变成了C-1,进入了新一轮循环;

3,那在这种情况下,如果c-1为偶数时,则fast还可以追上slow, 但是 c-1为奇数时,则fast不可以追上slow,因为他们之间的距离一直为c-1,一直是死循环所以,永远追不上的条件为N是奇数并且C-1也为奇数;所以也不是随便走

4,但是我们再从链表头到入口点进行推断,有slow走的距离:L;有fast走的距离为L+(n+1)*c-N

所以有3L=L+(n+1)*c-N,即2L=(n+1)*c-N,左边为偶数,所以根据等式二边奇偶性一样,我们不难推出N是奇数并且C-1也为奇数并不能共存!

5,所以,永远追不上的条件并不存在!;

已知:1,我们先设链表的头head到环的入口点的距离为L,环的长度为c,环的入口点到遇点为t

           2,slow与fast相遇不会出环,因为slow如果出环等于,slow走了一个c,那fast走了二个c,所以一定会相遇在环中

           3,设立快慢指针,让slow走一步,fast走二步

图解:

推理:  

1, 对于slow:走的距离为  L+t ,那么对于fast则为slow二倍2(L+t),fast也可以为L+n*c+t;

注意:为n*c,因为可能环的长度要远远小于L的长度,那么fast已经在环中走了好几圈;如图:

所以有等式2(L+t)==L+n*c+t;(n>=1)

解得:L=n*c-t=(n-1)*c+c-t;

2,一个指针从链表头head走,一个指针从相遇点走,他们会在环的入口点相遇(重点)

最后以缘分结尾,愿大家都能找到与你有缘分的那一个人!最后,你了解了原理,代码不是轻轻松松!

  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值