0%

链表环-快慢指针的数学原理

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Solution {
public boolean hasCycle(ListNode head) {
if(head == null){
return false;
}
ListNode slow = head;
ListNode fast = head.next;
while(slow != fast){
if(fast == null || fast.next == null){
return false;
}
slow = slow.next;
fast = fast.next.next;
}
return true;
}
}

原理解析

快指针慢指针距离1格,快指针每次移动2格,满指针每次移动1格。当两个指针都进入环后,那么移动n次且相遇时有:

(2n+1)%s=n%s=m,s:2n+1=sk1+m,k1Zn=sk2+m,k2Zn+1=s(k1k2),(k1,k2Z,k1>k2)

k1k2取合适的整数时,此方程的n有解。故若链表中存在环,那么快慢指针必定会相遇。

本文标题:链表环-快慢指针的数学原理

文章作者:SkecisAI

发布时间:2020年10月09日 - 17:40:57

最后更新:2021年12月02日 - 20:41:46

原始链接:http://www.skecis.top/2020/10/09/循环链表快慢指针/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

感谢你的支持,希望本文能助你一臂之力。

未找到相关的 Issues 进行评论

请联系 @skecis 初始化创建