环形链表题解析

一.环形链表1:

141. 环形链表 - 力扣(LeetCode)

解决这个问题时,我想到了上篇博客提到的快慢指针来试试,慢指针走一步,快指针走两步

不管对不对先把代码写出来:

接下来画图解析一下:

起初都在第一个节点的位置,接下来开始走,这时循环一次的位置:

循环两次的位置:

此时可以发现slow也进入环形链表中,此时fast就开始追slow:

再循环两次的时候快慢指针就都停留在了环形链表的起始节点了。

此时提交代码看看是否正确:

成功通过说明我们这个思路是正确的

问题1:那为什么会追到呢:

此时我们假设slow刚好在环形链表的环节点处,而此时fast肯定已经在环里面了,也有可能已经环绕了好几圈,现在假设fast离slow有N的距离

此时fast就开始追slow,然后距离缩减1最后循环一定会减到0成功追到slow.

问题2:如果slow走1步,fast走3步,4步,5步或n步能否追上:

这里假设这个环形链表的长度为C,slow待在环形链表的环节点处,fast离slow有N的距离.

如果fast走3步,slow走1步,所以两者的差距就是以二递减:

此时就要考虑到C-1的大小是多少了,此时就把C-1看做是N如果是偶数就追上了,如果是奇数就还是追不上,就是死循环了。

总结一下:N是偶数第一轮追击就追上了。N是奇数,第一轮就会错过,距离变成C-1,如果C-1是偶数,那么下一轮就追上了,如果C-1是奇数那么就永远追不上了。

fast走4步,5步或者n步的时候就跟3步一样分析,到最后还是要讨论C-一个值的奇偶大小。

问题3:永远追不上的条件:

根据fast走3步,slow走一步的总结:

则当N是奇数,C是偶数时就永远追不上了。但是这种情况一定存在吗:

分析如下:

此时你在看上面分析的情况,N是奇数C是偶数时永远追不上,但2*L永远是偶数,(x+1)*偶数-奇数为奇数,所以两边不相等,所以这种情况根本不存在。所以上面分析的永远追不上的情况是错误的。再根据刚才的等式N是奇数时,C也是奇数。N是偶数时,C也是偶数。所以结论是一定能够追上

二.环形链表2:

142. 环形链表 II - 力扣(LeetCode)

根据环形链表一,我们首先的思路还是用快慢指针先找到相遇点。

此时再用相遇点和链表的头节点一起走,当其相遇时就是环形链表的环节点,那为什么呢?

分析如下:

L=X*C-N=(X-1)*C+C-N

假设X=1则C-N=L,所以meet会与head相遇,如果X不为1,其实就是meet在圈里面转圈直至与head相遇。

所以代码如下:

还有一种思考就是,找到相交节点,然后再命名一个新的节点记录meet-->next的位置再将meet->next置为空

此时就是相交链表的问题:160. 相交链表 - 力扣(LeetCode)

相交链表的代码如图

整个代码如图

总结这就是关于两个环形链表的OJ题的详解

  • 19
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值