008.环形链表 II-双指针
题目链接:力扣
代码:
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-双指针相关推荐
- 【Leetcode】拿捏链表(四)——160. 相交链表、141. 环形链表、142. 环形链表 II
作者:一个喜欢猫咪的的程序员 专栏:<Leetcode> 喜欢的话:世间因为少年的挺身而出,而更加瑰丽. --<人民 ...
- LeetCode-链表-142. 环形链表 II
描述 142. 环形链表 II 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 ...
- 142. 环形链表 II golang
142. 环形链表 II 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始 ...
- LeetCode 142 环形链表 II
题目描述 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null.为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开 始). 如果 po ...
- leetcode142. 环形链表 II
leetcode142. 环形链表 II 题目描述 链接: leetcode142. 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整 ...
- 【LeetCode】【HOT】142. 环形链表 II(快慢指针)
[LeetCode][HOT]142. 环形链表 II 文章目录 [LeetCode][HOT]142. 环形链表 II package hot;class ListNode{int val;List ...
- LeetCode 142. 环形链表 II(Linked List Cycle II)
142. 环形链表 II 142. Linked List Cycle II 题目描述 给定一个链表,返回链表开始入环的第一个节点.如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整 ...
- 环形链表环形链表 II
文章目录 前言 1.141. 环形链表 证明为什么快指针一定为2步,慢指针一定为1步 1.当循环链表前的距离与循环链表后的距离相等时 2.当循环链表前的距离为循环链表后的距离的1/2 同种情况下,fa ...
- 如何判断链表中是否存在环?Floyd判圈算法 leetcode刷题笔记 142. 环形链表 II
这道题使用了floyd判圈算法,所以先讲解floyd算法的原理和实现,最后在附加上第142题的代码. floyd算法: 一.用途: 可以在有限状态机.迭代函数或者链表上判断是否存在环,求出该环的起点与 ...
- LeetCode 142. 环形链表 II - Python 快慢指针法+详解
题目 142. 环形链表 II 难度中等761 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的 ...
最新文章
- 一文读懂TOF深度相机技术原理--TI-Tintin-OPT8241二次开发和应用系列--Theory Level
- 如何实现微服务架构中的服务发现
- P3067 [USACO12OPEN]Balanced Cow Subsets G 折半搜索
- 使用PHP建立SVN的远程钩子,使用exec命令自动更新SVN的代码
- HTML+CSS+JS实现 ❤️酷炫HUD科幻数据屏幕动画界面❤️
- HomeBrew 安装 国内源
- Javascript学习笔记一 之 数据类型
- 用Winhex软件定位NTFS文件系统的不明白之处
- 【CF1369D】TediousLee(找规律递推——计数)
- 【前端面试题】02—59道CSS面试题(附答案)
- 数据处理(二):wgs84坐标的UTM投影
- 第1章练习题-SQL基础教程
- Adobe各种最新版本软件下载 PhotoShop Dreamweaver FW Ai Fl.....
- 爬虫需谨慎,你不知道的爬虫与反爬虫套路!
- 通过基因组选择预测杂交水稻的表现(数据挖掘)
- 数据分析学习笔记(六)-- 随机漫步
- 使用python计算夏普比率与最大回撤和最大回撤时间的程序
- 路遥《平凡的世界》经典哲语
- 还在纠结用啥颜色吗?直接用sasaki的经典配色!提升画图效率的好方法!
- 公交语音播报调试第三天