首页 > 其他分享 >LeetCode Hot100刷题记录-142. 环形链表 II

LeetCode Hot100刷题记录-142. 环形链表 II

时间:2024-09-12 10:03:17浏览次数:1  
标签:II head slow 142 相遇 fast next 链表

给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。

不允许修改 链表。

思路:
在这里我们起初让slow = fast = head,而不是像环形链表1那样让fast = head.next,因为这里我们需要找到环形链表的入口处。
那么如何确定环的入口呢?
这个问题的核心在于:当快慢指针相遇后,如何找到环的入口?这里有个非常巧妙的思路:
假设从链表头到环入口的距离是 a,从环入口到相遇点的距离是 b,从相遇点绕回环入口的距离是 c。
如果快慢指针相遇时,我们把一个指针放回链表的头部,并且这次两个指针都每次走一步,它们最终会在环的入口处再次相遇。这个过程的推导稍微复杂一点,但你可以理解为当两个指针再次相遇时,它们刚好相遇在环的入口处。

var detectCycle = function(head) {
    if (!head || !head.next) return null;
    
    let slow = head;
    let fast = head;
    
    // 第一步:先判断是否存在环
    while (fast && fast.next) {
        slow = slow.next;
        fast = fast.next.next;
        
        if (slow === fast) {
            // 第二步:如果有环,找环的入口
            let p1 = head;
            let p2 = slow;
            
            // 两个指针同时每次前进一步,直到它们相遇
            while (p1 !== p2) {
                p1 = p1.next;
                p2 = p2.next;
            }
            
            // 返回环的入口节点
            return p1;
        }
    }
    
    // 如果没有环,返回 null
    return null;
};

标签:II,head,slow,142,相遇,fast,next,链表
From: https://www.cnblogs.com/gardenOfCicy/p/18409611

相关文章

  • 141. 环形链表
    题目链接141.环形链表思路快慢指针-经典问题题解链接没想明白?一个视频讲透快慢指针!(Python/Java/C++/Go/JS)关键点whilefastandfast.next:...时间复杂度\(O(n)\)空间复杂度\(O(1)\)代码实现:classSolution:defhasCycle(self,head:Optio......
  • 142. 环形链表 II
    题目链接142.环形链表II思路快慢指针-经典应用:相遇后,移动head及slow直至相遇题解链接没想明白?一个视频讲透!含数学推导(Python/Java/C++/Go/JS)关键点whilefastandfast.next:...&&whilehead!=slow:...时间复杂度\(O(n)\)空间复杂度\(O(1)\)......
  • 2095. 删除链表的中间节点
    题目链接2095.删除链表的中间节点思路快慢指针-找到中间节点-简单扩展题解链接官方题解关键点whilefastandfast.next:...时间复杂度\(O(n)\)空间复杂度\(O(1)\)代码实现:classSolution:defdeleteMiddle(self,head:Optional[ListNode]......
  • 234. 回文链表
    题目链接234.回文链表思路链表综合题:快慢指针+指针翻转题解链接官方题解关键点whilefast.nextandfast.next.next:...时间复杂度\(O(n)\)空间复杂度\(O(1)\)代码实现:classSolution:defisPalindrome(self,head:Optional[ListNode])......
  • 876. 链表的中间结点
    题目链接876.链表的中间结点思路快慢指针-经典应用题题解链接没想明白?一个视频讲透!(Python/Java/C++/Go/JS/Rust)关键点whilefastandfast.next:...时间复杂度\(O(n)\)空间复杂度\(O(1)\)代码实现:classSolution:defmiddleNode(self,head......
  • 【Azure Cloud Service】在Azure云服务中收集CPU监控指标和IIS进程的DUMP方法
    问题描述在使用CloudService服务时,发现服务的CPU占用很高,在业务请求并不大的情况下,需要直到到底是什么进程占用了大量的CPU资源,已经如何获取IIS进程(w3wp.exe)的DUMP文件? 问题解答一:收集云服务中CPU的性能数据远程登录(RDP)到云服务的实例上,使用管理员身份运行以下命令:Lo......
  • 5.四数相加 II
    .-力扣(LeetCode)给定四个包含整数的数组列表 A,B,C,D,计算有多少个元组(i,j,k,l) ,使得 A[i]+B[j]+C[k]+D[l]=0。为了使问题简单化,所有的A,B,C,D具有相同的长度 N,且0≤N≤500。所有整数的范围在-2^28到2^28-1之间,最终结果不会超过 ......
  • IIC通信中设备的交互流程
    本文主要叙述,当两个设备进行IIC通信时,两个设备的交互流程,即主机的动作和从机的动作。当通过软件编程的方式实现设备间的IIC通信时,我们就是按照主机的动作或从机的动作来编写对应的代码。实际上,主机和从机是按照IIC通信协议的要求完成相应的动作的( IIC通信协议在文章IIC......
  • 122. 买卖股票的最佳时机 II
    给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。返回 你能获得的 最大 利润 。 示例1:输入:prices=[7,1,5,3,6,4]输......
  • 黑暗之魂 I&II 合集,豪华中文,重制最终版-灭绝深渊-原罪学者+全DLC+修改器,解压即
    游戏截图《黑暗之魂I&II合集》是一款由FromSoftware开发的经典动作角色扮演游戏合集,囊括了《黑暗之魂》系列的前两部作品:《黑暗之魂:重制版》和《黑暗之魂II:原罪学者》。该合集为玩家提供了进入深邃而神秘的黑暗奇幻世界的机会,体验系列标志性的高难度战斗和复杂的叙事设......