leetcode 141.环形链表 I - 142.环形链表 II 代码及指针相遇证明问题

这篇具有很好参考价值的文章主要介绍了leetcode 141.环形链表 I - 142.环形链表 II 代码及指针相遇证明问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

⭐️ 环形链表 I 题目描述

给你一个链表的头节点 head ,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。
如果链表中存在环 ,则返回 true 。 否则,返回 false
leetcode 141.环形链表 I - 142.环形链表 II 代码及指针相遇证明问题,刷题,leetcode,链表,算法,学习
思路:快慢指针问题。我们可以声明一个 fast 指针(一次走两步),声明一个 slow 指针(一次走一步)。如果链表中存在环,那么 fast 指针和 slow 指针就会相遇,如果相遇则代表有环,否则 fast 指针会结束代表没环。

🌠 为什么快指针走两步,慢指针走一步可以相遇?

图:
leetcode 141.环形链表 I - 142.环形链表 II 代码及指针相遇证明问题,刷题,leetcode,链表,算法,学习
leetcode 141.环形链表 I - 142.环形链表 II 代码及指针相遇证明问题,刷题,leetcode,链表,算法,学习

假设 slow 进环后,fastslow 距离是 N N N。这时候 fast 开始追击 slowfast 一次走两步,slow一次走一步,他们之间的距离每次缩小 1 1 1NN-1N-2...210最终他们相遇了,所以结论是肯定会相遇,因为他们的距离每次缩小 1 1 1

🌠 那快指针一次走三步,慢指针走一步可以相遇吗?

leetcode 141.环形链表 I - 142.环形链表 II 代码及指针相遇证明问题,刷题,leetcode,链表,算法,学习
还是假设 slow 进环后,fastslow 距离是 N N N。这时候 fast 一次走三步,slow 一次走一步,他们之间的距离每次缩小 2 2 2

  1. N N N 是偶数的情况:NN-2N-4...420 相遇追上了。
  2. N N N 是奇数的情况:NN-2N-4...31-1。这里 -1 意味着刚好错过了,但是此时 fast 是要超出 slow 一步,再假设环的大小是 C C C。那么现在 fastslow 的距离刚好是 C − 1 C - 1 C1步。又分为两种情况:
    • 如果 C − 1 C - 1 C1 是偶数的话,那么 fastslow 就可以相遇。
    • 如果 C − 1 C - 1 C1 是奇数的话,那么 fast 就会重复上面是奇数的情况,永远不会相遇。

结论:当 fast 一次走三步,slow 一次走一步,不一定可以相遇。
leetcode 141.环形链表 I - 142.环形链表 II 代码及指针相遇证明问题,刷题,leetcode,链表,算法,学习


leetcode链接:141.环形链表 I

⭕️ 代码:文章来源地址https://www.toymoban.com/news/detail-529663.html

bool hasCycle(struct ListNode *head) {
    struct ListNode * slow = head;
    struct ListNode * fast = head;
    
    // 考虑没有环的情况下,奇数和偶数个链表 fast 结束条件不同
    while (fast && fast->next) {
        fast = fast->next->next;
        slow = slow->next;

        if (fast == slow) {
            return true;
        }
    }

    return false;
}

⭐️ 环形链表 II 题目描述

给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 NULL。不允许修改链表。
结论是当一个指针从 fastslow 的相遇点 meet 开始走,一个指针从 head 位置开始走,最终 meethead 会在入环点相遇。
leetcode 141.环形链表 I - 142.环形链表 II 代码及指针相遇证明问题,刷题,leetcode,链表,算法,学习

🌠 为什么一个指针从相遇点走,一个指针从头走,他俩会在入环点相遇呢?

假设 head 到入环点的距离是 L L L ,入环点到相遇点的距离是 X X X,而环的大小是 C C C
首先 slow 进环之后,fast 在一圈之内,一定可以追上 slow!因为追击的过程他们距离每次缩小1,首先排除错过,而 slow 进环 fast 与其最大长度也只是 C − 1 C - 1 C1,所以 slow 最多走不到半圈,fast 就会追上。
slow 走的路程: L + X L + X L+X
fast 走的路程: L + N ∗ C + X L + N * C + X L+NC+X    ( N > = 1 ) (N>=1) (N>=1) 假设 slow 在进环前,fast 在环里转了 N N N 圈。

所以 fast 走了 slow 2倍。

  • 2 ∗ ( L + X ) = L + N ∗ C + X 2 * (L + X) = L + N * C + X 2(L+X)=L+NC+X
  • L + X = N ∗ C L + X = N * C L+X=NC
  • L = N ∗ C − X L = N * C - X L=NCX

所以 L L L 的距离就是绕了 N N N 圈之后到达 meet 的距离在减去 X X X 的距离,就是入环点。
结论:一个指针从 meet 开始走,一个指针从 head 开始走,他们会在入环点相遇。
leetcode 141.环形链表 I - 142.环形链表 II 代码及指针相遇证明问题,刷题,leetcode,链表,算法,学习


leetcode链接:142.环形链表 II

⭕️ 代码:

struct ListNode *detectCycle(struct ListNode *head) {
    struct ListNode * slow = head;
    struct ListNode * fast = head;
    
    // 考虑没有环的情况下,奇数和偶数个链表 fast 结束条件不同
    while (fast && fast->next) {
        fast = fast->next->next;
        slow = slow->next;

        if (fast == slow) {
             struct ListNode * meet = fast;
             while (head != meet) {
                 head = head->next;
                 meet = meet->next;
             }

             return meet;
        }
    }

    return NULL;
}

到了这里,关于leetcode 141.环形链表 I - 142.环形链表 II 代码及指针相遇证明问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 代码随想录 Leetcode142. 环形链表 II

            双指针解决百分之99的链表题

    2024年01月19日
    浏览(33)
  • 【双指针】142. 环形链表 II

    判断是否有环 https://blog.csdn.net/qq_44653420/article/details/131720199?spm=1001.2014.3001.5501 快慢指针相遇之后 然后在head处设置一个指针 相遇节点处设置一个指针 两个指针每次移动一步 最后相遇 相遇就是环入口

    2024年02月16日
    浏览(29)
  • 链表专题1—24. 两两交换链表中的节点 234.回文链表 143.重排链表 141.环形链表 142.环形链表II 160.链表相交 C++实现

    迭代法,时间复杂度: O ( n ) O(n) O ( n ) , 空间复杂度: O ( 1 ) O(1) O ( 1 ) 时间复杂度、空间复杂度: O ( n ) O(n) O ( n ) 止位置时,慢指针就在链表中间位置。 同时用pre记录慢指针指向节点的前一个节点,用来分割链表,将链表分为前后均等两部分,如果链表长度是奇数,那么

    2024年02月12日
    浏览(31)
  • 环形链表 II(力扣142)(快慢指针)

    142.环形链表—力扣 给定一个链表的头节点  head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到

    2023年04月25日
    浏览(28)
  • 【Leetcode】142.环形链表II

    题意: 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 为了表示给定链表中的环,使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。 说明 :不允许修改给定的链表。 一开始我是这么写的

    2024年02月16日
    浏览(23)
  • leetcode 142 环形链表II

    给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从

    2024年02月01日
    浏览(26)
  • LeetCode 142.环形链表II

    题目链接 👉 LeetCode 142.环形链表II👈 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示

    2024年02月12日
    浏览(32)
  • LeetCode:142. 环形链表 II

    🍎道阻且长,行则将至。🍓 🌻算法,不如说它是一种思考方式🍀 算法专栏: 👉🏻123 题目描述 :给定一个链表的头节点 head ,返回链表开始 入环的第一个节点 。 如果链表无环,则返回 null 。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在

    2024年02月07日
    浏览(28)
  • LeetCode刷题:142. 环形链表 II

    题目: 是否独立解决: 否,参考了解题思路解决问题,思考了用快慢指针,栈,统计链表数量定位尾巴节点(因为是环形链表所以是死循环,链表数量用while循环统计不出来)都没解决 解题思路:这题其实和环形链表一样的解题思路,用哈希set将数据都存储进去,如果发现

    2024年01月21日
    浏览(29)
  • ​LeetCode解法汇总142. 环形链表 II

    https://github.com/September26/java-algorithms 给定一个链表的头节点   head  ,返回链表开始入环的第一个节点。  如果链表无环,则返回  null 。 如果链表中有某个节点,可以通过连续跟踪  next  指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 

    2024年02月14日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包