LeetCode.链表.141+142环形链表,附详细证明过程+多图分析

Posted 凛音Rinne

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode.链表.141+142环形链表,附详细证明过程+多图分析相关的知识,希望对你有一定的参考价值。

环形链表


问题一:判断链表是否有环

📝题目指路:141. 环形链表 - 力扣(LeetCode) (leetcode-cn.com)


问题一思路分析

🎷首先题目已经给出了思路:

  • 🎨如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环

👞👞这就类似于追赶/追及的问题,我们经常用到的是 快慢指针👞👞

我们将上面的链表图转换为更为简单的直观图

  • 🎯fastslow两个人赛跑
  • 🎯fast先进入环

  • 🎯等到slow开始进入环的时候,开始追及问题

  • 🎯假设 环的长度为C

  • 🎯此时fastslow相差C - X

  • 🎯而fast追slow的时候,每一步都会使得C-X1

  • 🎯所以最终他们会相遇

  • 🎯如果他们相遇了,证明这是个环

  • 🎯如果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;
    
}

问题二:如果相遇了,在哪相遇的

📝题目指路:142. 环形链表 II - 力扣(LeetCode) (leetcode-cn.com)


问题二思路分析 + 相遇点证明过程

先回到一开始,slow进入环,fast开始追击的时候

📌假设 环的长度为C

📌此时fastslow相差C - X(fast追slow)

📌设slowfast走了t1

📌slow的速度是1个节点/次,fast的速度是2个节点/次,

📌二者相遇之前,是fastslowfastslow相差X

📌列出式子2t1 - t1 = X 又因为 t1 = L

📌得出:t1 = X = L


相遇的时候

从这里开始计时,

✒️设slowfast走了t

✒️slow的速度是1个节点/次,fast的速度是2个节点/次

✒️二者相遇之前,是fastslowfastslow相差C - X

✒️列出式子2t - t = C - X

✒️得出:t = C - X

✒️slow走了C - X

💡从此时相遇且从此时开始我们定义一个 新指针指向链表起点

💡slow再开始一步一步走,直到,curslow地址相同,找到环形的入口

📒📒代码如下:

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环形链表,附详细证明过程+多图分析的主要内容,如果未能解决你的问题,请参考以下文章

算法-leetcode-142. 环形链表 II

算法热门:环形链表II(LeetCode 142)

链表题 剑指21.删除链表的倒数第n个节点剑指22.链表的倒数第k个节点234.回文链表141.环形链表142.环形链表Ⅱ 160.相交链表 21.合并两个有序链表

141. 环形链表 142.环形链表

[算法] leetcode单链表相关题目详解

LeetCode刷题模版:141 - 150