代码随想录算法训练营第四天(补充)|142.环形链表

代码随想录算法训练营第四天(补充)|142.环形链表

142.环形链表II(补day04)

题目链接:https://leetcode.cn/problems/linked-list-cycle-ii/

双指针法

这道题其实有两小问,第一个是判断链表中是否有环,第二个是找出环的起始结点。这道题方法比较多,这里展示了快慢指针法来解决环的问题,具体代码如下:

ListNode *detectCycle(ListNode *head) {
        ListNode*fast=head;
        ListNode*slow=head;
        while(fast!=NULL&&fast->next!=NULL)
        {
            fast=fast->next->next;
            slow=slow->next;
            if(fast==slow)
            {
                slow=head;
                while(slow!=fast)
                {
                    slow=slow->next;
                    fast=fast->next;
                }
                return fast;  
            }
        }
        return NULL;
    }

其实主要是两个疑难点

  1. fast指针与slow指针相遇与有环成等价关系吗?fast指针可不可能直接跳过slow指针呢?

答:由于slow一次性走一步,fast一次性走两步,以slow为参考系,fast只走一步。由于在相遇前,肯定是fast在追赶slow(fast要比slow多走几圈),当假设slow静止的时候,fast是一步一步追赶的,所以fast不可能跳过slow,两者必然能相遇。相遇了说明fast回来了,那么肯定是有环的。

  1. 明白1之后,如何找到环的起始位置呢?

答:我们设该链表长度为x+y+z,其中,x为环外,(y+z)为环内且y为前半圈,z为后半圈。当fast指针和slow指针相遇时,一定满足:
2 ( x + y ) = x + y + n ( y + z ) 2(x+y)=x+y+n(y+z) 2(x+y)=x+y+n(y+z)
即:
x = n ( y + z ) − y = ( n − 1 ) ( y + z ) + z x=n(y+z)-y=(n-1)(y+z)+z x=n(y+z)y=(n1)(y+z)+z
由于n>=1,我们取n=1,可得:x = z

由此说明:从链表的起始位置到环的起始位置,与相遇点到环的起始位置相等!由此关系可确定环的起始位置了。
具体的代码细节:(有些时候代码细节可能比思路更重要!)

  1. while(fast!=NULL&&fast->next!=NULL),循环条件要注意,由于fast一次性走两步即fast=fast->next->next,所以要求fast和fast->next都决不能是空指针,否则会引起空指针异常!

  2. slow=head;将slow”归零“,尽量不要定义太多指针,能用之前的就用之前的

  3. 用代码语言表示满足x = z关系的环的起始节点:

						slow=head;
                      while(slow!=fast)
                      {
                          slow=slow->next;
                          fast=fast->next;
                      }
                      return fast; 	
  • 15
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码随想录算法训练营是一个优质的学习和讨论平台,提供了丰富的算法训练内容和讨论交流机会。在训练营中,学员们可以通过观看视频讲解来学习算法知识,并根据讲解内容进行刷题练习。此外,训练营还提供了刷题建议,例如先看视频、了解自己所使用的编程语言、使用日志等方法来提高刷题效果和语言掌握程度。 训练营中的讨论内容非常丰富,涵盖了各种算法知识点和解题方法。例如,在第14天的训练营中,讲解了二叉树的理论基础、递归遍历、迭代遍历和统一遍历的内容。此外,在讨论中还分享了相关的博客文章和配图,帮助学员更好地理解和掌握二叉树的遍历方法。 训练营还提供了每日的讨论知识点,例如在第15天的讨论中,介绍了层序遍历的方法和使用队列来模拟一层一层遍历的效果。在第16天的讨论中,重点讨论了如何进行调试(debug)的方法,认为掌握调试技巧可以帮助学员更好地解决问题和写出正确的算法代码。 总之,代码随想录算法训练营是一个提供优质学习和讨论环境的平台,可以帮助学员系统地学习算法知识,并提供了丰富的讨论内容和刷题建议来提高算法编程能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [代码随想录算法训练营每日精华](https://blog.csdn.net/weixin_38556197/article/details/128462133)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值