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

【算法】【动态规划】斐波那契数模型

【算法】【动态规划】斐波那契数模型

目录 * 一、动态规划解题模版 * 二、第N个泰波那契数 * 三、⾯试题 08.01. 三步问题 * 四、746. 使⽤最⼩花费爬楼梯(easy) * 五、91.解码⽅法 一、动态规划解题模版 1. 状态表示:我们一般创建一个一维数组dp,把dp表填满,其中的某一个值就是结果。而状态表示就是指这个dp表中元素的含义; 1.1. 来源:题目要求,经验+题目要求 ,分析问题的过程中的重复子问题 2. 状态转移方程:dp[ i ] = ? 3. 初始化:保证根据状态转移方程填表时不越界 4. 填表顺序:为了填写当前状态的时候,所需要的状态已经计算过了 5. 返回值:题目要求 + 状态表示

By Ne0inhk
实现Python将csv数据导入到Neo4j

实现Python将csv数据导入到Neo4j

目录 一、获取数据集 1.1 获取数据集 1.2 以“记事本”方式打开文件 1.3  另存为“UTF-8”格式文件 1.4 选择“是” 二、 打开Neo4j并运行 2.1 创建新的Neo4j数据库 2.2 分别设置数据库名和密码 编辑 2.3 启动Neo4j数据库 2.4 打开Neo4j数据库  2.5 运行查看该数据库是否为空 三、打开Python创建项目  3.1 创建一个包,存项目 3.2 创建一个项目 3.3 检查自己的依赖是否完全

By Ne0inhk
【算法通关指南:算法基础篇】二分答案专题:1.木材加工 2.砍树

【算法通关指南:算法基础篇】二分答案专题:1.木材加工 2.砍树

🔥小龙报:个人主页 🎬作者简介:C++研发,嵌入式,机器人方向学习者 ❄️个人专栏:《算法通关指南 》 ✨ 永远相信美好的事情即将发生 文章目录 * 前言 * 一、二分答案 * 二、二分答案经典算题 * 2.1 木材加工 * 2.1.1题目 * 2.1.2 算法原理 * 2.1.3 代码 * 2.2 砍树 * 2.2.1 题目 * 2.2.2 算法原理 * 2.2.3 代码 * 总结与每日励志 前言 二分答案是算法竞赛与笔试中极具技巧性的高分解法,核心思路是将复杂求解转化为简洁的二分+判定,

By Ne0inhk
《算法题讲解指南:优选算法-分治-快排》--45.数组中的第k个最大元素,46.最小的k个数

《算法题讲解指南:优选算法-分治-快排》--45.数组中的第k个最大元素,46.最小的k个数

🔥小叶-duck:个人主页 ❄️个人专栏:《Data-Structure-Learning》 《C++入门到进阶&自我学习过程记录》《算法题讲解指南》--优选算法 ✨未择之路,不须回头 已择之路,纵是荆棘遍野,亦作花海遨游 目录 45.数组中的第k个最大元素 题目链接: 题目描述: 题目示例: 解法(快速选择算法): 算法思路: C++算法代码: 算法总结及流程解析: 46.最小的k个数 题目链接: 题目描述: 题目示例: 编辑 解法(快速选择算法): 算法思路: C++算法代码: 算法总结及流程解析: 结束语 45.数组中的第k个最大元素 题目链接: 215. 数组中的第K个最大元素 - 力扣(LeetCode) 题目描述: 题目示例:

By Ne0inhk