LeetCode.链表.141+142环形链表,附详细证明过程+多图分析
Posted 凛音Rinne
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode.链表.141+142环形链表,附详细证明过程+多图分析相关的知识,希望对你有一定的参考价值。
环形链表
问题一:判断链表是否有环
问题一思路分析
🎷首先题目已经给出了思路:
- 🎨如果链表中有某个节点,可以通过连续跟踪
next
指针再次到达,则链表中存在环
👞👞这就类似于追赶/追及
的问题,我们经常用到的是 快慢指针
👞👞
我们将上面的链表图转换为更为简单的直观图
- 🎯
fast
和slow
两个人赛跑 - 🎯fast先进入环
-
🎯等到
slow
开始进入环的时候,开始追及问题
-
🎯假设
环的长度为C
-
🎯此时
fast
和slow
相差C - X
-
🎯而fast追slow的时候,每一步都会使得
C-X
少1
-
🎯所以
最终他们会相遇
-
🎯如果他们
相遇
了,证明这是个环
- 🎯如果
slow遇不到fast,fast先遇到NULL
,证明这不是个环
📖📖代码如下:
bool hasCycle(struct ListNode *head) {
struct ListNode *slow = head;
struct ListNode *fast = head;
while(fast && fast->next)
{
slow = slow->next;
fast = fast->next->next;
if(slow == fast)
{
return true;
}
}
return false;
}
问题二:如果相遇了,在哪相遇的
问题二思路分析 + 相遇点证明过程
先回到一开始,slow
进入环,fast
开始追击的时候
📌假设 环的长度为C
📌此时fast
和slow
相差C - X
(fast追slow)
📌设slow
和fast
走了t1
次
📌slow
的速度是1
个节点/次,fast
的速度是2
个节点/次,
📌二者相遇之前,是fast
追slow
,fast
和slow
相差X
📌列出式子2t1 - t1 = X
又因为 t1 = L
📌得出:t1 = X = L
相遇的时候
从这里开始计时,
✒️设slow
和fast
走了t
次
✒️slow
的速度是1
个节点/次,fast
的速度是2
个节点/次
✒️二者相遇之前,是fast
追slow
,fast
和slow
相差C - X
✒️列出式子2t - t = C - X
✒️得出:t = C - X
✒️slow走了C - X
💡从此时相遇且从此时开始我们定义一个 新指针指向链表起点
💡slow
再开始一步一步走,直到,cur
和slow
地址相同,找到环形的入口
📒📒代码如下:
struct ListNode *detectCycle(struct ListNode *head) {
struct ListNode *fast = head;
struct ListNode *slow = head;
while(fast && fast->next)
{
fast = fast->next->next;
slow = slow->next;
if(fast == slow)
{
struct ListNode *cur = head;
while(slow != cur)
{
cur = cur->next;
slow = slow->next;
}
return cur;
}
}
return NULL;
}
以上是关于LeetCode.链表.141+142环形链表,附详细证明过程+多图分析的主要内容,如果未能解决你的问题,请参考以下文章
链表题 剑指21.删除链表的倒数第n个节点剑指22.链表的倒数第k个节点234.回文链表141.环形链表142.环形链表Ⅱ 160.相交链表 21.合并两个有序链表