本文主要是介绍【证明】快慢指针在带环链表中是否存在无法相遇的情形,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
- 1. 前言
- 2. 证明过程
- 2.1 证明
- 2.2 加证
- 3. 结论
- 4. 结语
1. 前言
在了解本次内容前,可以先了解一下带环链表中使用快慢指针来判断链表是否带环的内容。
链表带环问题之判断链表是否带环
而本文我们探究的问题是快慢指针在带环链表中是否存在无法相遇的情形,在此背景下,我们的快慢指针之间的速度比可以不再是快指针走两步,慢指针走一步,而是可以将他们定位任意的步数,只要快指针走的比慢指针快即可。
本问探究的情况是当快指针依次走三步,慢指针一次走一步的情形,此情形的道德结论同样适用于其他速率比(例如 3:5,2:5)。
PS.下述证明过程中的速率比均为实际步数比,
例如 3:1为FAST走三步,SLOW走一步。
例如 4:3为FAST走四步,SLOW走三步。
2. 证明过程
2.1 证明
FAST | SLOW |
---|---|
3 | 1 |
在此处我们直接快进到SLOW到达入环点的时刻,此时FAST想要追到SLOW还需要追赶的距离为N。
在上文中我们提到本次证明的情况为FAST : SLOW = 3 : 1。
故每次移动FAST都会让其与SLOW的距离减少 2。
如下表格体现:
当N为偶数时 | 当N为奇数时 |
---|---|
N - 2 | N - 2 |
N - 4 | N - 4 |
… | … |
4 | 3 |
2 | 1 |
0(相遇) | -1(第一次错过) |
我们发现当N为偶数时一定会相遇,当N为奇数时第一次FAST会与SLOW擦肩而过。
此时我们再讨论第一次错过后的情形,假设环的一圈距离为C,当第一次错过时,FAST与SLOW在新一轮追逐过程中的距离为C - 1。
当C - 1为偶数时 | 当C - 1为奇数时 |
---|---|
C - 1 - 2 | C - 1 - 2 |
C - 1 - 4 | C - 1 - 4 |
… | … |
4 | 3 |
2 | 1 |
0(相遇) | -1(第二次错过) |
我们发现如果想让快慢指针在环中永远不会相遇,也就是FAST多指向的地址永远不会等于SLOW所指向的地址,那么就需要C - 1为奇数,且N也同时为奇数,此时我们使用反证法来证明快慢指针在带环链表中是否存在无法相遇的情形。
假设C - 1 为奇数,那么C就为偶数,且同时N为奇数。
而我们可以很轻松的得到,FAST在SLOW刚刚到达入环点时走过的路程为:
3L = L + X * C + C - N
通过简单的数学计算可以得到:
2L = ( X + 1 ) * C - N
令2L为A部分, ( X + 1 ) * C为B部分,N为C部分,显然A为偶数。
A | B | C | B - C | 结果 |
---|---|---|---|---|
偶数 | 偶数 | 奇数 | 奇数 | 等号不成立 |
偶数 | 偶数 | 偶数 | 偶数 | 等号成立 |
偶数 | 奇数(此时要求C为奇数且X + 1为奇数) | 偶数 | 奇数 | 等号不成立 |
偶数 | 奇数(此时要求C为奇数且X + 1为奇数) | 奇数 | 偶数 | 等号成立 |
通过上表我们可以发现,当等号成立时不存在C为偶数,N为奇数的情形,故快慢指针在3 :1的速度比之下不存在永远无法相遇的情形。
2.2 加证
为了证明更加严谨,我们加证一条FAST :SLOW = 4 :3的情形。
我们可以得到,SLOW刚刚到达入环点时走过的路程为:
3L
FAST在SLOW刚刚到达入环点时走过的路程为:
4L = 3L + X * C + C - N
通过简单的数学计算可以得到:
L = ( X + 1 ) * C - N
FAST与SLOW的追赶路程为N
当N为偶数时 | 当N为奇数时 |
---|---|
N - 1 | N - 1 |
N - 2 | N - 2 |
… | … |
2 | 2 |
1 | 1 |
0(相遇) | 0(相遇) |
故我们可以清楚的看到当FAST :SLOW = 4 :3 时,无论N为偶数还是N为奇数都一定会相遇。
3. 结论
通过上文证明我们可以发现:
当 FAST与SLOW速度差为偶数时,在等号成立的前提下,不同时存在C为偶数且N为奇数的情形,即当FAST与SLOW速度差为偶数时一定会相遇。
当 FAST与SLOW速度差为奇数时,无论N为奇数还是偶数,都一定会相遇。
故 不存在快慢指针在带环链表中无法相遇的情形,反证法得证。
4. 结语
十分感谢您观看我的原创文章。
本文主要用于个人学习和知识分享,学习路漫漫,如有错误,感谢指正。
如需引用,注明地址。
这篇关于【证明】快慢指针在带环链表中是否存在无法相遇的情形的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!