题目链接:力扣

代码:

class Solution {
public:ListNode *detectCycle(ListNode *head) {ListNode* fast = head;ListNode* slow = head;while(fast != NULL && fast->next != NULL) {slow = slow->next;fast = fast->next->next;// 快慢指针相遇,此时从head 和 相遇点,同时查找直至相遇if (slow == fast) {ListNode* index1 = fast;ListNode* index2 = head;while (index1 != index2) {index1 = index1->next;index2 = index2->next;}return index2; // 返回环的入口}}return NULL;}
};

大概思路:

顺序:先找相遇点,然后再找入口节点

找相遇点的数学理解,用移动次数对等,slow为x+y,fast为[x+y+n(y+z)]/2  (因为fast一次走两步)
对等化简得,x+y=n(y+z),由于是求入口节点位置,也就是x,所以得x=n(y+z)-y,

然后再化简得x=(n-1)(y+z)+z,

(咋化简来的?把n变成n+1-1,再把+1腾出来,为啥画成这样,我也不明白)

然后由此可得,n=1的时候,x=z,意思就是当转了一圈的时候,从相遇点出发到入口的距离z,这个时候等于出发点到入口的距离x。

(为啥要n=1?理由可能是消了数字好判断吧)

这样一来,通过slow移动1步,fast移动2步的方式,得到了“相遇点”,也就是求x,然后再整两个指针从头结点处和相遇节点处,开始+1+1遍历,当他们相遇了就是入口节点。

遇见的问题:

01.

null怎么返回?

这个wilie条件如何理解不是环吗?哪有null?

oo,这两个问题是一起的,while的条件是无限进行查值的,如果是有环的链表,那就不会碰见NULL,就会查找的入口节点为止。如果是没环的链表,那么终点会有NULL,则会停止while操作。

02.

为啥要n=1,n=100不行吗?

听卡哥的视频说,不管是1还是100还是n,快慢指针都是会相遇的,只是用1好解释。(100也会相遇?算了,一般这种情况会去验算一下,看看结果,不过老师直接说结果了,那就跳过验算这一步好了)

03.

为什么第一次在环中相遇,slow的 步数 是 x+y 而不是 x + 若干环的长度 + y 呢?

下图是环展开的图(本质上还是一个环,只是路程展开了),fast先入场,从入口1进入(因为fast比slow先进环)(入口123都是一个入口)

这个时候如果slow进环(入口2),那fast一定在环的某处,按路程来算,因为fast是+2+2,slow是+1+1,所以一定是fast比slow先到入口3.(因为fast+2+2,相对于slow就是+1+1,所以fast和slow必然在第一个环相遇)

个人想法:

这题是真麻烦啊,来回看好几遍了都,虽然都是在书上看,没直接打,和写博客记录,果然光看书效率还是低的

008.环形链表 II-双指针相关推荐

  1. 【Leetcode】拿捏链表(四)——160. 相交链表、141. 环形链表、142. 环形链表 II

    作者:一个喜欢猫咪的的程序员 专栏:<Leetcode> 喜欢的话:世间因为少年的挺身而出,而更加瑰丽.                                  --<人民 ...

  2. LeetCode-链表-142. 环形链表 II

    描述 142. 环形链表 II 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 ...

  3. 142. 环形链表 II golang

    142. 环形链表 II 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始 ...

  4. LeetCode 142 环形链表 II

    题目描述 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null.为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开 始). 如果 po ...

  5. leetcode142. 环形链表 II

    leetcode142. 环形链表 II 题目描述 链接: leetcode142. 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整 ...

  6. 【LeetCode】【HOT】142. 环形链表 II(快慢指针)

    [LeetCode][HOT]142. 环形链表 II 文章目录 [LeetCode][HOT]142. 环形链表 II package hot;class ListNode{int val;List ...

  7. LeetCode 142. 环形链表 II(Linked List Cycle II)

    142. 环形链表 II 142. Linked List Cycle II 题目描述 给定一个链表,返回链表开始入环的第一个节点.如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整 ...

  8. 环形链表环形链表 II

    文章目录 前言 1.141. 环形链表 证明为什么快指针一定为2步,慢指针一定为1步 1.当循环链表前的距离与循环链表后的距离相等时 2.当循环链表前的距离为循环链表后的距离的1/2 同种情况下,fa ...

  9. 如何判断链表中是否存在环?Floyd判圈算法 leetcode刷题笔记 142. 环形链表 II

    这道题使用了floyd判圈算法,所以先讲解floyd算法的原理和实现,最后在附加上第142题的代码. floyd算法: 一.用途: 可以在有限状态机.迭代函数或者链表上判断是否存在环,求出该环的起点与 ...

  10. LeetCode 142. 环形链表 II - Python 快慢指针法+详解

    题目 142. 环形链表 II 难度中等761 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的 ...

最新文章

  1. 一文读懂TOF深度相机技术原理--TI-Tintin-OPT8241二次开发和应用系列--Theory Level
  2. 如何实现微服务架构中的服务发现
  3. P3067 [USACO12OPEN]Balanced Cow Subsets G 折半搜索
  4. 使用PHP建立SVN的远程钩子,使用exec命令自动更新SVN的代码
  5. HTML+CSS+JS实现 ❤️酷炫HUD科幻数据屏幕动画界面❤️
  6. HomeBrew 安装 国内源
  7. Javascript学习笔记一 之 数据类型
  8. 用Winhex软件定位NTFS文件系统的不明白之处
  9. 【CF1369D】TediousLee(找规律递推——计数)
  10. 【前端面试题】02—59道CSS面试题(附答案)
  11. 数据处理(二):wgs84坐标的UTM投影
  12. 第1章练习题-SQL基础教程
  13. Adobe各种最新版本软件下载 PhotoShop Dreamweaver FW Ai Fl.....
  14. 爬虫需谨慎,你不知道的爬虫与反爬虫套路!
  15. 通过基因组选择预测杂交水稻的表现(数据挖掘)
  16. 数据分析学习笔记(六)-- 随机漫步
  17. 使用python计算夏普比率与最大回撤和最大回撤时间的程序
  18. 路遥《平凡的世界》经典哲语
  19. 还在纠结用啥颜色吗?直接用sasaki的经典配色!提升画图效率的好方法!
  20. 公交语音播报调试第三天

热门文章

  1. DB2 with的定义与用法
  2. jquery和JavaScript之间的联系和区别
  3. 不定积分、定积分的区别与联系
  4. FPGA-出租车计价器的实现
  5. 关于学习如何组装基于F4V3S飞控的竞速穿越机
  6. React的核心概念—— Jsx、 Component、 Props、 Refs、 State
  7. 你必须知道的89个操作系统核心概念
  8. SVM算法(三层境界)
  9. JS实现HTM搜索关键词高亮显示
  10. 20175208 《Java程序设计》第十一周学习总结