寻找闭环入口——快慢指针

核心思想:

两个人在赛跑,一个人跑的快,一个人跑的慢。

如果在某一时刻,跑的快的人赶上跑的慢的人,那么说明是环形跑道。

如果跑的快的人跑到了终点,说明不是环形的跑道

算法实现:

定义两个指针:slow和fast,fast指针每次移动两个位置,slow指针每次移动一个位置。第一步确定是否存在闭环,第二步根据相遇到的位置,可以找出闭环的入口。

第一步:确定是否存在闭环

移动slow和fast指针,如果连个指针相遇,则说明存在闭环。如下图,快慢指针都从位置1出发,最终会在位置6相遇。

第二步:利用相遇点寻找入口 

在找到相遇点后,初始化新的两个指针p1和p2,一个指向起始点(p1),一个指向相遇点(p2)。两个指针每次的移动距离都为1。

假设从起始点到入口点的距离为a,从入口点到相遇点的距离为b,从相遇点到入口点的距离为c。则可以有以下表达式,其中d\left ( fast \right )表示快指针移动的距离,d\left ( slow \right )表示慢指针移动的距离。

                                                                         \\\2\cdot d\left ( slow \right )=d\left ( fast \right )\\\ 2\cdot \left ( a+b \right )=a+b+c+a\\\2a+2b=2a=b+c\\\ b=c

因为b=c,那么从相遇点出发和从起始点出发,遍历相同数目的位置后,会在入口处相遇

示例代码:

https://blog.csdn.net/liu_feng_zi_/article/details/106992043

https://blog.csdn.net/liu_feng_zi_/article/details/107002938

https://blog.csdn.net/liu_feng_zi_/article/details/107734649

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值