解密链表环的起点:LeetCode 142 题

解密链表环的起点:LeetCode 142 题

解密链表环的起点:LeetCode 142 题

视频地址

因为想更好的为大佬服务,制作了同步视频,这是Bilibili的视频地址

🌟 引言

链表环检测问题在C++中同样是一个经典面试题。本文将用C++实现LeetCode 142题"环形链表II"的解决方案,深入讲解快慢指针算法的原理和实现细节。

🔍 问题描述

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

🧠 解题思路回顾

快慢指针算法

  1. 使用两个指针:slow每次走一步,fast每次走两步
  2. 如果两指针相遇,说明链表有环
  3. 将其中一个指针重置到链表头,然后两指针以相同速度前进
  4. 再次相遇的位置就是环的起点

数学原理

设:

  • 链表头到环起点距离:a
  • 环起点到相遇点距离:b
  • 相遇点到环起点距离:c

则有:

  • 第一次相遇时:slow走了a+bfast走了a+b+c+b
  • 因为fast速度是slow的两倍:2(a+b) = a+2b+c
  • 推导得:a = c

💻 C++代码实现

/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */classSolution{public: ListNode *detectCycle(ListNode *head){// 边界条件处理if(head ==nullptr|| head->next ==nullptr){returnnullptr;} ListNode *slow = head; ListNode *fast = head;// 第一阶段:检测是否有环while(fast !=nullptr&& fast->next !=nullptr){ slow = slow->next; fast = fast->next->next;if(slow == fast){break;// 相遇说明有环}}// 检查是否因为无环退出循环if(fast ==nullptr|| fast->next ==nullptr){returnnullptr;}// 第二阶段:寻找环起点 slow = head;// 重置慢指针到头部while(slow != fast){ slow = slow->next; fast = fast->next;}return slow;// 相遇点即为环起点}};

🛠 代码解析

数据结构定义

structListNode{int val; ListNode *next;ListNode(int x):val(x),next(NULL){}};

这是LeetCode标准的链表节点定义,包含一个整数值和指向下一个节点的指针。

算法实现细节

寻找环起点

slow = head;// 重置慢指针到头部while(slow != fast){ slow = slow->next; fast = fast->next;}

根据数学推导,两指针以相同速度前进,再次相遇点即为环起点。

无环检查

if(fast ==nullptr|| fast->next ==nullptr){returnnullptr;}

如果因为快指针无法前进而退出循环,说明无环。

环检测阶段

while(fast !=nullptr&& fast->next !=nullptr){ slow = slow->next; fast = fast->next->next;if(slow == fast){break;// 相遇说明有环}}

快指针每次走两步,慢指针每次走一步,直到相遇或快指针无法前进。

指针初始化

ListNode *slow = head; ListNode *fast = head;

快慢指针都从头节点开始。

边界条件处理

if(head ==nullptr|| head->next ==nullptr){returnnullptr;}

处理空链表或单节点链表的特殊情况。

🚀 性能分析

  • 时间复杂度:O(n)
    • 最坏情况下需要遍历链表两次
  • 空间复杂度:O(1)
    • 只使用了固定数量的指针变量

🐞 常见问题与调试

常见错误

  1. 初始条件处理
    忘记处理空链表或单节点链表的情况。
  2. 指针重置错误
    在第二阶段错误地重置了快指针而不是慢指针。

空指针访问

while(fast !=nullptr&& fast->next !=nullptr)

必须同时检查fastfast->next,否则可能访问空指针的next成员。

调试技巧

  1. 小规模测试
    • 无环链表:1->2->3->null
    • 有环链表:1->2->3->4->2(环在节点2)
  2. 边界测试
    • 空链表
    • 单节点自环链表
    • 双节点互相指向的链表

打印指针地址

cout <<"Slow: "<< slow <<" Fast: "<< fast << endl;

帮助跟踪指针移动情况。

📊 复杂度对比表

方法时间复杂度空间复杂度适用场景
哈希表法O(n)O(n)需要简单实现时
快慢指针O(n)O(1)需要节省空间时

🌈 总结

通过C++实现的快慢指针算法,我们能够高效地解决链表环检测问题。关键在于:

  1. 理解快慢指针相遇的数学原理
  2. 正确处理边界条件和指针访问

分两个阶段实现:环检测和环起点定位

解密链表环的起点:LeetCode 142 题

这种方法不仅高效(O(n)时间,O(1)空间),而且体现了算法设计的巧妙之处。掌握这个技巧,你就能轻松应对链表相关的各种环检测问题了!

Read more

OpenClaw开源汉化发行版:介绍、下载、安装、配置教程

OpenClaw开源汉化发行版:介绍、下载、安装、配置教程 🎬 背景 🦞 想要一个 100% 私有化、全中文界面的 AI 助手? OpenClaw 汉化版让你零门槛拥有! 这是 GitHub 100,000+ Stars 明星项目的开源中文发行版——不仅做了深度界面汉化(CLI + Dashboard 全中文),更实现了每小时自动同步官方更新,汉化版延迟 < 1 小时,让你既享受中文体验,又不掉队最新功能。 通过 WhatsApp、Telegram、Discord 就能指挥你的 AI 处理邮件、日历、文件,数据完全本地掌控,告别隐私焦虑。无论你是 Docker 老手还是命令行小白,3 步即可上手,本教程覆盖安装、配置、升级、

By Ne0inhk
侠客行・iOS 26 Liquid Glass TabBar 破阵记

侠客行・iOS 26 Liquid Glass TabBar 破阵记

引子 话说侠客岛旁的 “码农山庄” 里,有位青年开发者石破天,一手 SwiftUI 功夫练得炉火纯青,身旁常伴着心思缜密的产品女侠阿绣。 这日,山庄接到一桩棘手活计 —— 玄铁老怪掌管的 “APP 审核阁” 放出话来,凡要上 iOS 26 的 APP,必过Liquid Glass设计关,尤其Tab Bar这块,稍有差池便打回重练。 在本篇侠客行中,您将学到如下内容: * 引子 * 1. 📱 初探 iOS 26 的 Tab Bar:旧功新用,基础先扎牢 * 2. 🔍 拆解 Tab Bar 的模糊特效:藏在 “滚动容器” 里的玄机 * 3. 📜 给 TabView 加 “缩骨功”

By Ne0inhk
无人机与机器人群控通信技术的现状与未来展望

无人机与机器人群控通信技术的现状与未来展望

随着人工智能和自动化技术的迅速发展,无人机群控和机器人群控在多个领域的应用不断扩展。从智能农业到灾难救援、从物流运输到城市巡检,群控技术已经成为实现大规模协同作业的核心动力。然而,这些技术的应用离不开强大的通信基础设施支持。那么,现有的通信技术如何满足这些需求?未来市场又需要怎样的通信技术和指标? 一、无人机与机器人群控通信技术的现状 目前,无人机和机器人群控的通信技术主要有以下几种: 1. Wi-Fi (包括 Wi-Fi 6/6E/7) * 优点:高带宽、低延迟,能够支持高清视频传输和实时控制。 * 缺点:在大规模群控中,Wi-Fi 网络会受到距离、干扰和拥堵问题的影响,尤其是在复杂环境或信号密集的区域。 2. 5G NR (新无线) * 优点:高带宽、低延迟,特别适合需要大数据量传输和实时控制的应用,如无人机群控。 * 缺点:5G的基础设施建设仍然在发展中,部署成本较高,且对设备的能耗有一定要求,这可能限制了它在小型无人机和低功耗设备上的广泛应用。 3. LoRa (长距离低功耗无线) * 优点:长距离、

By Ne0inhk
论文阅读 SAM 3: Segment Anything with Concepts

论文阅读 SAM 3: Segment Anything with Concepts

创新点 * 首次定义 Promptable Concept Segmentation (PCS)可提示概念分割任务,支持通过名词短语、图像样本或两者结合,检测、分割并跟踪图像 / 视频中所有匹配概念的实例,同时保留视频帧间目标身份。 * 引入 “存在头(Presence Token)” 解耦识别与定位任务;采用共享骨干网络的检测器 + 视频跟踪器架构,避免任务冲突。 * 构建四阶段数据引擎,通过媒体筛选、标签生成(含难负样本)、AI 验证器实现标注吞吐量翻倍,生成高质量的合成训练数据。 * 创建包含 20.7 万个独特概念的 SA-CO (大规模概念分割数据集与基准体系),涵盖 12 万张图像和 1.7 千个视频,概念数量是现有基准的 50 倍以上,支持 PCS 任务全面评估 问题 SAM系列(Kirillov等人,2023年;

By Ne0inhk