LeetCode:链表中是否存在环的证明问题。

发布于 2022-09-12 04:00:53 字数 482 浏览 10 评论 0

判断链表中是否存在环,通常使用双指针的方式,因为快指针、慢指针最终都会在环中相遇,但如何证明这两个指针一定会相遇呢,推倒过程如下:
1.png
2.png
3.png
4.png

我的疑问是:算式(3)是通过怎样的方式转换为算式(4)的呢?

------------------------分割线------------------------
反向证明如下:
image

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

猫九 2022-09-19 04:00:53

我们的思路就是:设置两个快慢指针(快慢指针即两个指针起点相同,慢指针每次走一步,快指针走两步),让它们一直往下走,直到它们相等,说明有环。下面简单证明,

如上图,A 为链表第一个结点,B 为环与链表的交叉点,C 为快慢指针相遇的位置。假设环的长度为 r,则有

$$
\frac {AB+BC+n_1r}{2}=AB+BC+n_2r\tag{左为快指针,右为慢指针}
$$

其中,r 为正整数(即 1,2,3...),AB、BC 为非负整数(即 0,1,2,3...),n1 和 n2 分别为快指针、慢指针走的圈数,也为非负整数。接着化简为:

$$
AB+BC=(n_1-2n_2)r
$$

一个有环的单链表,其 AB 和 r 是固定的,所以只要使 n1 和 n2 变化至使 BC 能满足是一个非负整数的条件即可。

仔细观察上式,我们发现,C 点一定是唯一的。

$$
BC=nr-AB \tag{其中 $n=n_1-2n_2$}
$$

这个证明很简单。对于任意两个满足条件的不同的 n 值,一小一大,相比较而言,它们计算出的两个 BC 值的差值一定是整除 r 的,所以 C 点必定唯一。

转自:https://ethsonliu.com/2019/08/single-linked-list-interview.html - 2.6

淡淡の花香 2022-09-19 04:00:53

(a + b) % c = (a % c + b % c) % c

这个证明把 () % c 部分约掉了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文