热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

快慢指针_快慢指针找链表中的环

本文由编程笔记#小编为大家整理,主要介绍了快慢指针找链表中的环相关的知识,希望对你有一定的参考价值。 
本文由编程笔记#小编为大家整理,主要介绍了快慢指针找链表中的环相关的知识,希望对你有一定的参考价值。



 





一、一定会相遇的证明

1、如果链表没有环,那么快指针比慢指针先到达尾部(null)

2、如果链表有环的话,因为快指针走的比慢指针快,所以在环中相遇的过程可以看作是快指针从环后边追赶慢指针的过程。

用递归法证明,快慢指针一定会相遇:

(1)快指针与慢指针之间差一步。此时继续往后走,慢指针前进一步,快指针前进两步,两者相遇。
(2)快指针与慢指针之间差两步。此时继续往后走,慢指针前进一步,快指针前进两步,两者之间相差一步,转化为第一种情况。
(3)快指针与慢指针之间差N步。此时继续往后走,慢指针前进一步,快指针前进两步,两者之间相差(N+1-2)即N-1步。重复这个过程,直到快指针和慢指针相遇。


因此,此题得证。所以快指针必然与慢指针相遇。


参考:
作者:知乎用户
链接:https://www.zhihu.com/question/23208893/answer/117115415

 

推导:慢指针进入环后,快指针最多多绕一个圈。

快指针F先进环,慢指针S后进。

假设慢指针进环那一刻快指针差m步能追上(0<= m 环),根据上边结论,两个指针走m次就会相遇了。

因为m 环,所以快指针在慢指针进环那一刻最多比慢指针多绕一个圈。

 


二、环长度

快指针和慢指针第一次相遇时的节点pq(碰撞点),快指针和慢指针从该点开始继续往前走,再次碰撞时所用的操作数就是环的长度Length

证明:由上边的推导可得,这里的m为Lengh

 


三、连接点

技术图片

 

假设慢指针进入环中时,即连接点p,快指针(q)需要m步才能追上慢指针。

p和q第一次相遇时,碰撞点在pq处。此时,p走到pq时用了m步。

 假设head到p的距离为a,环长度为Length,慢指针走了s步,则快指针走了2s步。

从上图可知:

s = a + m

2s = a + m + n * Length(n为快指针绕环的圈数)

可得

a = n * Length环 - m

也就是:若在头结点和相遇结点分别设一指针,同步(单步)前进,则最后一定相遇在环入口结点p。

可根据这个结论来找到入口节点。


四、带环链表总长度

找到连接点p后,求head到p的长度,再加上环的长度,即为链表的总长。




推荐阅读
author-avatar
手机用户2502913375
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有