吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 958|回复: 7
收起左侧

[讨论] 一道leetcode快慢指针的题目

[复制链接]
头像被屏蔽
薇尔莉特 发表于 2021-3-10 19:42
提示: 作者被禁止或删除 内容自动屏蔽

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

hui00000 发表于 2021-3-10 20:12
本帖最后由 hui00000 于 2021-3-10 20:30 编辑

假设链表在环开始前有n1个结点,成环的结点个数为n2,这里的n1、n2以及后面的x、m都是正整数
先分析第一次相遇
第一次相遇的时候,假设慢指针走了一共走了x步,考虑到相遇了,那么必有x>n1,即慢指针在无环的区域走了n1个结点,在环里面走了x-n1个结点;考虑到,快指针的速度是慢指针的两倍,这个时候,快指针走了一共走了2x-1步,快指针在无环的区域走了n1个结点,在环里面走了2x-n1-1个结点;
考虑到相遇的情况,则快指针比慢指针在环里面多走的结点数一定是环结点数的倍数,即 (2x-n1-1)-(x-n1)=n2的倍数,化简后是x-1=n2的倍数,可以表示为x=m*n2+1。
接下来看第二次相遇
从第一次相遇到第二次相遇,走的结点数量可以由快指针确定,即n1,第二次相遇的时候,慢指针一共走了x+n1步,其中慢指针在无环的区域走了n1个结点,在环里面走了x个结点,换个说法,慢指针在环里面走了m*n2+1个结点,即走了m圈之后,又走了一步,即所处位置为进入环的第一个位置,也就是环的起点。
头像被屏蔽
 楼主| 薇尔莉特 发表于 2021-3-10 20:30
QingYi. 发表于 2021-3-10 21:05
在LeetCode 的 Commit and Solution中 有很多优质的解释
lidelongqi 发表于 2021-3-10 21:56
Untitled1.png
  • 使用双指针判断链表中是否有环,慢指针slow每次走一步,快指针fast每次走两步,若链表中有环,则两指针必定相遇。
  • 假设环的长度为L,环上入口距离链表头距离为a,两指针第一次相遇处距离环入口为b,则另一段环的长度为c=L-b,由于快指针走过的距离是慢指针的两倍,则有a+L+b=2*(a+b),又有L=b+c,可得a=c,故当判断有环时(slow==fast)时,移动头指针,同时移动慢指针,两指针相遇处即为环的入口。
头像被屏蔽
 楼主| 薇尔莉特 发表于 2021-3-10 22:25
提示: 作者被禁止或删除 内容自动屏蔽
头像被屏蔽
 楼主| 薇尔莉特 发表于 2021-3-10 22:26
提示: 作者被禁止或删除 内容自动屏蔽
c03xp 发表于 2021-3-11 14:06
妙啊。。。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-6-17 19:49

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表