Leetcode142. 环形链表 II

LeetCode142——环形链表II 我的LeetCode代码仓:https://github.com/617076674/LeetCode 原题链接:https://leetcode-cn.com/problems/linked-list-cycle-ii/description/ 题目描述: 知识点:哈希表、双指针、链表 思路一:用一个hashSet来存储已经遍历过的节点 本题是LeetCode141——环形链表的加... 阅读详情

Every day a Leetcode

题目来源:142. 环形链表 II

解法1:快慢指针

对于链表找环路的问题,有一个通用的解法——快慢指针(Floyd 判圈法)。

给定两个指针,分别命名为 slow 和 fast,起始位置在链表的开头。

每次 fast 前进两步,slow 前进一步。如果 fast 可以走到尽头,那么说明没有环路;如果 fast 可以无限走下去,那么说明一定有环路,且一定存在一个时刻 slow 和 fast 相遇。

当 slow 和 fast 第一次相遇时,我们将fast 重新移动到链表开头,并让 slow 和 fast 每次都前进一步。当 slow 和 fast 第二次相遇时,相遇的节点即为环路的开始点。

代码:

/*
 * @lc app=leetcode.cn id=142 lang=cpp
 *
 * [142] 环形链表 II
 */

// @lc code=start
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution
{
public:
    ListNode *detectCycle(ListNode *head)
    {
        ListNode *fast = head, *slow = head;
        // 判断是否存在环路
        do
        {
            if (fast == nullptr || fast->next == nullptr)
                return nullptr;
            fast = fast->next->next;
            slow = slow->next;
        } while (fast != slow);
        // 如果存在,查找环路节点
        fast = head;
        while (fast != slow)
        {
            slow = slow->next;
            fast = fast->next;
        }
        return fast;
    }
};
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(N),其中 N 为链表中节点的数目。在最初判断快慢指针是否相遇时,slow 指针走过的距离不会超过链表的总长度;随后寻找入环点时,走过的距离也不会超过链表的总长度。因此,总的执行时间为 O(N) + O(N) = O(N)。

空间复杂度:O(1)。我们只使用了 slow, fast 两个指针。

解法2:哈希

一个非常直观的思路是:我们遍历链表中的每个节点,并将它记录下来;一旦遇到了此前遍历过的节点,就可以判定链表中存在环。借助哈希表可以很方便地实现。

代码:

/*
 * @lc app=leetcode.cn id=142 lang=cpp
 *
 * [142] 环形链表 II
 */

// @lc code=start
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution
{
public:
    ListNode *detectCycle(ListNode *head)
    {
        ListNode *p = head;
        unordered_set<ListNode *> visited;
        while (p != nullptr)
        {
            if (visited.count(p))
                return p;
            visited.insert(p);
            p = p->next;
        }
        return nullptr;
    }
};
// class Solution
// {
// public:
//     ListNode *detectCycle(ListNode *head)
//     {
//         ListNode *fast = head, *slow = head;
//         // 判断是否存在环路
//         do
//         {
//             if (fast == nullptr || fast->next == nullptr)
//                 return nullptr;
//             fast = fast->next->next;
//             slow = slow->next;
//         } while (fast != slow);
//         // 如果存在,查找环路节点
//         fast = head;
//         while (fast != slow)
//         {
//             slow = slow->next;
//             fast = fast->next;
//         }
//         return fast;
//     }
// };
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(N),其中 N 为链表中节点的数目。我们恰好需要访问链表中的每一个节点。

空间复杂度:O(N),其中 N 为链表中节点的数目。我们需要将链表中的每个节点都保存在哈希表当中。

【中等】力扣算法题解析LeetCode142:环形链表 II 本题要求找到链表中环的入口节点,若不存在环则返回 null。采用快慢指针法(Floyd算法): 判环阶段:快指针(每次两步)和慢指针(每次一步)若相遇则存在环; 定位入口:将快指针重置到头节点,两指针同速移动,再次相遇点即为环入口。 数学原理:通过路程关系推导出 头节点到入口的距离 = 相遇点到入口的距离 + (k-1)环长。 阅读详情

相关推荐

第17篇:深入解析OpenEuler 24.03系统中的逻辑卷管理(LVM)

OpenEuler 24.03系统中的逻辑卷管理(LVM)提供了灵活的存储管理方案,通过在物理存储与文件系统间构建抽象层实现动态资源分配。

专注于系统运维、数据库、DevOps、虚拟化技术、docker、kubernetes、等云原生技术。 1690

Leetcode第142题—环形链表Ⅱ

LeetCode第142题—环形链表Ⅱ、数据结构、java

Green_756的博客 716

西门子S7-1200 PLC控制步进电机实战:从I/O分配到梯形图,手把手教你实现正反转与调速

本文详细介绍了如何使用西门子S7-1200 PLC控制步进电机,从硬件接线到梯形图编程,实现正反转与三档调速功能。通过I/O分配、脉冲生成逻辑和方向控制等核心步骤,帮助工程师快速掌握PLC控制步进电机的关键技术,提升工业自动化项目的实施效率。

weixin_28733777的博客 536

Leetcode 142-环形链表 II

题目描述 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。 说明:不允许修改给定的链表。 进阶: 你是否可以使用 O(1) 空间解决此题? 题解 题解转载自Krahets 算法流程:(双指针法) 双指针第一次相遇: 设两指针 fast,slow 指向链表头部 hea

Helene1996的博客 266

stm32f407等芯片(HAL库)时钟频率修改(乱码)

其他片子及库文件未知、未验证,只是在使用stm32f407ZG配置串口打印的时候,出现乱码,就从以下几方面定位问题: 1. 确认串口GPIO相关配置; 2. 确认波特率等参数; 3. 确认时钟频率; 结果这次使用YH的串口打印程序在ZDYZ的开发板调试项目工程(有点另类...),做功能验证,就出现了以上问题,出于好奇开始调试,最终发现是时钟频率问题。 看到下图这个配置,因为ZDYZ开发板使用的是8MHz外部晶振(好像默认的是25MHz,如图2),所以他这里PLL_M是25,不是推荐值,感...

bulefire2009的博客 5517

从萤石云到GB28181:海康4G摄像机接入第三方平台的曲折之路

本文深入探讨了海康4G摄像机接入第三方平台时遇到的协议冲突问题,特别是GB28181与萤石云服务的互斥性。通过技术分析揭示了4G模块的定向流量限制和协议栈资源竞争等核心问题,并提供了有线接入测试和萤石云API二次开发等解决方案。最后总结了设备选型的关键参数和协议兼容性检查清单,为安防监控系统集成提供实用指导。

mango的博客 999

力扣第142题.环形链表II

142. 环形链表 II题目题解一:快慢指针题解二:哈希表 题目 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。 不允许修改 链表。 示例 1: 输入:hea

m0_51456787的博客 1217

N5105 PVE UEFI核显直通Windows:从黑屏到HDMI输出的实战调优

本文详细介绍了在N5105处理器上实现PVE UEFI核显直通Windows的实战调优方法。针对黑屏和HDMI音频无法识别等常见问题,提供了系统参数调整、驱动模块加载、虚拟机配置等解决方案,帮助用户成功实现核显直通并优化性能。

weixin_42566424的博客 207

LeetCode:142:环形链表 II(链表系列)

环形链表II

qq_43751200的博客 768

Unity3d移动端性能优化

以下条目主要针对移动端,大部分也适合PC端 一、Profiler的使用 1.性能优化应贯穿项目开发的全过程,如需求(性能能不能达到要求)、设计、开发、测试等。不能开发结束才优化性能。 2.官方推荐的优化工具是【Window】->【Profiler】 3.确认瓶颈是CPU-bound(Gfx.WaitForCommands)还是CPU-bound(Gfx.WaitForPresent) 4.内存分析使用Memory Profiler 二、内存优作 5.减少内存收集的影...

zouxin_88的专栏 3063

AI Agent 入门(一):什么是 AI Agent?——从概念到第一个 API 调用

AI Agent 入门(一):什么是 AI Agent?——从概念到第一个 API 调用

nbtang的博客 257

【C】leetcode力扣—— 142. 环形链表 II

指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数。这个问题在之前的环形链表Ⅰ文章中已经详细分析过了。:链表中有一个环,其尾部连接到第二个节点。:链表中有一个环,其尾部连接到第一个节点。如果链表中有某个节点,可以通过连续跟踪。这时我们就解决了找环的入口的问题!来表示链表尾连接到链表中的位置(,仅仅是为了标识链表的实际情况。:返回索引为 1 的链表节点。:返回索引为 0 的链表节点。如果链表无环,则返回。给定一个链表的头节点。,则在该链表中没有环。

一岁就可帅的博客 908

游戏大厂技术护城河——为什么你抄不了原神?

│ │ │ │ ↓ 通过 │ │ │ │。│ │ │ │ ↓ 成功 │ │ │ │。│ │ │ │ ↓ 完成 │ │ │ │。│ │ │ │ ↓ 达标 │ │ │ │。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 71

LeetCode第142题_环形链表II

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

qq_40263592的博客 2211

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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

当快慢指针相遇时,将一个新的指针index1放在相遇点,另一个新的指针index2放在链表的头节点。可以使用快慢指针法,分别定义 fast 和 slow 指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast 和 slow指针在途中相遇 ,说明这个链表有环。环形入口节点到 fast指针与slow指针相遇节点 节点数为y。这就意味着,从头结点出发一个指针,从相遇节点 也出发一个指针,这两个指针每次只走一个节点, 那么当这两个指针相遇的时候就是 环形入口的节点。

m0_73841621的博客 1850

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

力扣142.环形链表II

使用快慢指针,快指针每次走两步,慢指针每次走一步,如果快慢指针相遇,说明有环。空间复杂度:O(n) 链表中的每个节点都保存在哈希集合当中。快慢指针相遇节点和链表头结点指针同步前进,相遇点为环的入口。2.该节点在哈希集合中 -> 说明此处成环 -> 返回该节点。时间复杂度:O(n) n为链表节点个数。链表中有一个环,其尾部连接到第二个节点。链表中有一个环,其尾部连接到第一个节点。,返回链表开始入环的第一个节点。来表示链表尾连接到链表中的位置(,则在该链表中没有环。

m0_74931837的博客 2235

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Leetcode 142. 环形链表 II

Leetcode 142. 环形链表 II1、问题分析2、问题解决3、总结 1、问题分析 题目链接:https://leetcode-cn.com/problems/linked-list-cycle-ii/   本质上就是一个快慢指针判断环问题。代码我已经进行了详细的注释,理解应该没有问题,读者可以作为参考,如果看不懂(可以多看几遍),欢迎留言哦!我看到会解答一下。 2、问题解决   笔者以C++方式解决。 #include "iostream" using namespace std; #inclu

珍惜 9011

力扣142.环形链表 II

摘要:本文介绍了检测链表环的两种解法。哈希表法利用集合存储节点地址,通过重复检测判断环入口,空间复杂度O(n)。更优的快慢指针法空间复杂度O(1):1)快指针(2步/次)与慢指针(1步/次)相遇判断有环;2)推导证明a=c(头到入口距离=相遇点到入口距离);3)相遇后将快指针重置到头部,两指针同速前进,再次相遇点即为环入口。最终给出C++实现代码,时间复杂度O(n)。

2302_78913144的博客 1037

LeetCode:142. 环形链表 II

LeetCode:142. 环形链表 II 题目描述:给定一个链表的头节点 head,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。 不允许修改 链表。

Super algorithm 的博客,技术爱好者。 1217

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

给定一个链表的头节点head,返回链表开始入环的第一个节点。如果链表无环,则返回null。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(如果pos是-1,则在该链表中没有环。pos,仅仅是为了标识链表的实际情况。链表。输入:head = [3,2,0,-4], pos = 1输出:返回索引为 1 的链表节点解释:链表中有一个环,其尾部连接到第二个节点。

Dubhehug的博客 853

LeetCode 142 环形链表 II 快慢指针分析

LeetCode 142 环形链表 II题目思路代码 题目 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。 说明:不允许修改给定的链表。 示例 1: 输入:head = [3,2,0,-4], pos = 1 输出:ta...

kennyJ的博客 347

LeetCode:142. 环形链表 II(python)

LeetCode:142. 环形链表 II(python) 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。 说明:不允许修改给定的链表。 示例 1: 输入:head = [3,2,0,-4], pos = 1 输出:ta...

wk的博客 1711

力扣142. 环形链表 II

给定一个链表的头节点head,返回链表开始入环的第一个节点。如果链表无环,则返回null。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(如果pos是-1,则在该链表中没有环。pos,仅仅是为了标识链表的实际情况。链表。返回索引为 1 的链表节点链表中有一个环,其尾部连接到第二个节点。返回索引为 0 的链表节点链表中有一个环,其尾部连接到第一个节点。返回 null链表中没有环。

hellooooooi的博客 646

leetcode 142. 环形链表 II medium

leetcode142. 环形链表 II medium 题目描述: 给定一个链表,返回链表开始入环的第一个节点。如果链表无环,则返回null。 解题思路: 同样快慢指针法,一个 慢指针p1每次走1步,一个快指针p2每次走2步,假如无环,快指针一定遇到终点也就是 next是nullptr,那直接返回nullptr,假如有环,那p1和p2肯定会在环中的某个位置相遇...

speargod的博客 154

leetcode-142力扣环形链表 II

环形链表 II slow指针移动速度为1 fast指针移动速度为2 同时开始移动 实心点为相遇点,当slow慢指针与fast指针相遇时,起点到相遇点的距离为r,即slow走了r的距离,相同时间按照fast速度可见它走了2r的距离。 故起始点到相遇点为r距离;相遇点到相遇点距离为2r-r。问题是寻找链表开始入环的第一个节点,第一个入环点到相遇点为公共边,那么此时一个指针从起始出发一个指针从相遇点出发,以相同速度,必然会在第一个入环点相遇。(因为距离和速度相同) public class Soluti.

城溪羡鱼的博客 161

Leetcode 142. 环形链表 II C++

Leetcode 142. 环形链表 II 题目 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。 说明:不允许修改给定的链表。 测试样例 示例 1: 输入:head = [3,2,0,-4], pos = 1 输出:tail connects to node index 1 解释:链表中有一个环,其尾部连接到第二个节点。 示例

weixin_43750513的博客 215
上一篇: 计算机图形学
下一篇: Leetcode76. 最小覆盖子串
UestcXiye
博客等级 码龄8年 9032粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值