LeetCode 141题:环形链表的艺术与科学

LeetCode 141题:环形链表的艺术与科学

🌟 LeetCode 141题:环形链表的艺术与科学

因为想更好地为义父义母大佬服务,本文 Bilibili 视频地址

🌀 环形链表:当数据开始循环舞蹈

在计算机科学的世界里,链表是一种优雅而基础的数据结构。正常链表如同一条笔直的小路,从起点(head)出发,每个节点指向下一个节点,最终以空指针(nullptr)作为终点,标志着旅程的结束。

Head

Node1

Node2

Node3

nullptr

然而,环形链表则打破了这种线性规则,它更像是一个神秘的莫比乌斯环,没有真正的终点。链表的某个节点不再指向空,而是指向链表中已经存在的另一个节点,形成了一个无尽的循环。

Head

Node1

Node2

Node3

Node4

🔍 解法一:哈希表法 - 记忆的艺术

解题思路

想象你是一位侦探,正在追踪一个可能陷入循环的线索。你需要记录下每一个经过的节点,就像在犯罪地图上钉上标记。每当遇到新节点时,你都要检查这个地点是否曾经出现过。

boolhasCycle(ListNode *head){ unordered_set<ListNode*> visited;while(head !=nullptr){if(visited.count(head)){returntrue;// 发现重复访问,存在环} visited.insert(head); head = head->next;}returnfalse;// 正常到达终点,无环}

性能分析

指标说明
时间复杂度O(n)最坏情况需要遍历整个链表
空间复杂度O(n)需要存储所有访问过的节点

这种方法直观易懂,但需要额外的存储空间。哈希表的选择至关重要,它决定了查找效率。在C++中,unordered_set提供了平均O(1)的查找时间复杂度。

🏃‍♂️ 解法二:快慢指针法 - 龟兔赛跑的智慧

解题思路

受龟兔赛跑寓言的启发,我们让两个指针以不同速度遍历链表。如果存在环,快指针终将追上慢指针;如果不存在环,快指针会先到达终点。

指针移动

Head

Node1

Node2

Node3

Node4

slow

fast

boolhasCycle(ListNode *head){if(head ==nullptr|| head->next ==nullptr){returnfalse;} ListNode* slow = head; ListNode* fast = head->next;while(slow != fast){if(fast ==nullptr|| fast->next ==nullptr){returnfalse;// 快指针到达终点,无环} slow = slow->next;// 乌龟每次一步 fast = fast->next->next;// 兔子每次两步}returntrue;// 相遇,存在环}

性能优势

指标说明
时间复杂度O(n)线性时间解决问题
空间复杂度O(1)仅需两个指针,常数空间

这种方法不需要额外存储空间,是空间最优解。它体现了计算机科学中常见的双指针技巧,广泛应用于链表相关问题。

💻 代码实现与调试心得

在力扣平台上实现时,有几个关键点需要注意:

  1. 边界条件处理:空链表或单节点链表直接返回false
  2. 指针移动顺序:先移动指针再判断,避免错过相遇点
  3. 循环终止条件:快指针或其next为null时即可确定无环

调试过程中,我最初忽略了fast->next的判空,导致在偶数长度链表上报错。通过添加这个检查,代码变得更加健壮。

🌈 思维与实现的分离

在解决算法问题时,思维过程具体实现是两个不同的层面:

  1. 思维层面:考虑问题本质,寻找规律和模式
  2. 实现层面:将思维转化为代码,处理边界条件和语言特性

优秀的程序员能够在这两个层面间自如切换,既能看到森林,也能处理每棵树。

🎯 总结

环形链表判断是链表操作中的经典问题,两种解法各有千秋:

  • 哈希表法:直观易懂,适合教学和理解问题本质
  • 快慢指针法:空间高效,体现了算法优化的智慧
 LeetCode 141题:环形链表的艺术与科学

掌握这两种方法,不仅能解决LeetCode 141题,更能为处理更复杂的链表问题打下坚实基础。记住,在编程的世界里,有时候跑得快的兔子确实能教会我们很多!

Read more

dfs专题8——子集

dfs专题8——子集

🔥近津薪荼: [个人主页]🎬个人专栏: 《近津薪荼的算法日迹》《Linux操作系统及网络基础知识分享》《c++基础知识详解》《c语言基础知识详解》✨不要物化,矮化,弱化,钝化自己,保持锋芒,不要停止学习这个世界上只有两个人真正在注意着你八岁的你,和八十岁的你,他们此刻正在注视着你,一个希望你 勇敢开始,一个希望你 不留遗憾 1.上期参考代码 classSolution{ vector<vector<int>>ret; vector<int>path; vector<bool>check=vector<bool>(6,false);public: vector<

By Ne0inhk
HDFS数据块机制深度解析:块大小设计与存储哲学

HDFS数据块机制深度解析:块大小设计与存储哲学

HDFS数据块机制深度解析:块大小设计与存储哲学 * 引言:块——HDFS存储的核心抽象 * 一、HDFS默认块大小 * 1.1 版本演进与默认值 * 1.2 查看和验证块大小 * 1.3 配置文件中的设置 * 二、为什么HDFS采用块存储? * 2.1 核心设计思想 * 2.2 详细解析:为什么块存储如此重要? * **2.2.1 减少寻址开销,提升I/O效率** * **2.2.2 支持超大文件,超越单机限制** * **2.2.3 简化存储设计,降低元数据复杂度** * **2.2.4 便于数据复制,增强容错性** * **2.2.5 支持数据本地性,

By Ne0inhk
【算法通关指南:数据结构与算法篇】二叉树相关算法题:1.二叉树深度 2.求先序排列

【算法通关指南:数据结构与算法篇】二叉树相关算法题:1.二叉树深度 2.求先序排列

🔥小龙报:个人主页 🎬作者简介:C++研发,嵌入式,机器人方向学习者 ❄️个人专栏:《算法通关指南》 ✨ 永远相信美好的事情即将发生 文章目录 * 前言 * 一、二叉树深度 * 2.1题目 * 2.2 算法原理 * 2.3代码 * 二、 求先序排列 * 3.1题目 * 3.2 算法原理 * 3.3代码 * 总结与每日励志 前言 本专栏聚焦算法题实战,系统讲解算法模块:以《c++编程》,《数据结构和算法》《基础算法》《算法实战》 等几个板块以题带点,讲解思路与代码实现,帮助大家快速提升代码能力ps:本章节题目分两部分,比较基础笔者只附上代码供大家参考,其他的笔者会附上自己的思考和讲解,希望和大家一起努力见证自己的算法成长 一、二叉树深度 2.

By Ne0inhk
《算法题讲解指南:优选算法-位运算》--35.两个整数之和,36.只出现一次的数字 ||,37.消失的两个数字

《算法题讲解指南:优选算法-位运算》--35.两个整数之和,36.只出现一次的数字 ||,37.消失的两个数字

🔥小叶-duck:个人主页 ❄️个人专栏:《Data-Structure-Learning》 《C++入门到进阶&自我学习过程记录》《算法题讲解指南》--从优选到贪心 ✨未择之路,不须回头 已择之路,纵是荆棘遍野,亦作花海遨游 目录 35.两个整数之和 题目链接: 题目描述: 题目示例: 解法(位运算): 算法思路: C++算法代码: 算法总结及流程解析: 36.只出现一次的数字 || 题目链接: 题目描述: 题目示例: 解法(比特位计数): 算法思路: C++算法代码: 算法总结及流程解析: 38. 消失的两个数字 题目链接: 题目描述: 题目示例: 解法(位运算): 算法思路: C++算法代码: 算法总结及流程解析: 结束语

By Ne0inhk