当前位置: 首页 > news >正文

快慢指针巧解链表环检测(多解)

题目Leetcode141

给你一个链表的头节点head,判断链表中是否有环。

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

如果链表中存在环,则返回true。 否则,返回false

示例一

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

Python解法

解法一:哈希表

class Solution: def hasCycle(self, head: Optional[ListNode]) -> bool: seen = set() while head: if head in seen: return True seen.add(head) head = head.next return False

每次遍历到一个节点时,判断该节点此前是否被访问过。

解法二:快慢指针

class Solution: def hasCycle(self, head: Optional[ListNode]) -> bool: if not head or not head.next: return False slow = head fast = head.next while slow != fast: if not fast or not fast.next: return False slow = slow.next fast = fast.next.next return True

方法二逻辑

以示例展示过程

1,带环链表演示示意图(示例链表:3→2→0→4→2)

2,分步追踪移动过程(3→2→0→4→2 环形链表逐轮演示)

第一轮:移动后:slow=2,fast=0

第二轮:移动后:slow=0,fast=2

第三轮:移动后:slow=4,fast=4

相遇终止(判定有环)

Java解法

1.哈希表

public class Solution{ public boolean hasCycle(ListNode head){ Set<ListNode> seen = new HashSet<ListNode>(); while(head != null){ boolean isAddSuccess = seen.add(head); // add失败,说明当前节点已经在集合中,链表有环 if(!isAddSuccess){ return true; } head = head.next; } return false; } }

2.快慢指针

public class Solution { public boolean hasCycle(ListNode head) { if(head == null || head.next == null){ return false; } ListNode slow = head; ListNode fast = head.next; while(slow != fast){ if(fast == null || fast.next == null){ return false; } slow = slow.next; fast = fast.next.next; } return true; } }

C++解法

1.哈希表

class Solution{ public: bool hasCycle(ListNode *head){ unordered_set<ListNode*> seen; while(head != nullptr){ if(seen.count(head)){ return true; } seen.insert(head); head = head->next; } return false; } };

2.快慢指针

class Solution { public: bool hasCycle(ListNode *head) { if (head == nullptr || head->next == nullptr) { return false; } ListNode* slow = head; ListNode* fast = head->next; while (slow != fast) { if (fast == nullptr || fast->next == nullptr) { return false; } slow = slow->next; fast = fast->next->next; } return true; } };
http://www.jsqmd.com/news/1070043/

相关文章:

  • CocoaHTTPServer:为Apple生态系统构建的嵌入式HTTP服务器框架
  • 红日靶场二:WebLogic CVE-2019-2725 到域控沦陷全流程
  • TEMU销售数据统计应该怎么做?看不懂账单的TEMU卖家有福了
  • 别再问 AMD 显卡能不能跑 AI,SGLang 加 TileLang 组合拳给你答案
  • 桑坦德银行向全体员工开放AI工具,首季创造3500万欧元价值
  • 中小企业怎么做GEO优化?AI时代低成本长效获客指南
  • RAG项目简历上人人都在写 但面试官真正想听的只有这六件事
  • 多派生与多继承演示职读类StuTeech
  • Project Based Learning:26万Star的编程项目实战教程集合
  • HIP 算子兼容性排查,AMD 显卡微调中那些奇怪的报错与解法
  • 青年长江答辩PPT 3大致命坑 避开直接提分
  • MateClaw v1.6.0 发布:补齐企业 Agent 工程能力,多方面升级助力生产环境
  • 一站式AI音乐创作平台怎么选?主流AI写歌工具真实使用体验对比
  • AVR单片机内部温度传感器校准指南:从原理到单点/两点校准实践
  • 软件系统集成门槛高?主流系统集成平台测评+实用技巧,新手收藏
  • linux内核中阶梯判断switch-case的一种罕见用法(连续阶梯值的情况)
  • Windows下载教程 Windows 10 保姆级安装步骤(附镜像文件)系统重装图文详解
  • 毕业季通关变革!2026一站式AI写作辅助网站终极指南
  • 36氪新浪潮大会:值得买科技朱越分享AI时代消费决策链路变化与品牌应对策略
  • Project Glasswing 扩展后,研发团队该怎么接住 AI 漏洞发现能力
  • 在重庆驾校学车,真实体验到底怎么样?
  • github克隆项目加速
  • GLM-5.2 vs GPT-5.5 成本实算:每天 1 万/10 万/100 万次请求的账单差距(2026)
  • ATtiny20 8位MCU超低功耗设计实战:从架构解析到物联网终端应用
  • 掉发和白发同时出现?高仕星维生素b的双重营养方案
  • 从零搭建 Kubernetes 1.30 集群:基于 kubeadm 的完整部署与集群管理指南
  • 2026实战:用Gemini镜像站解决Spring Boot微服务性能瓶颈与故障排查
  • 易元智创APP:AI智能画面去杂物,海南易元现实科技有限公司一键净化实拍场景
  • 零代码组态开发实操:串口屏项目从数月迭代压缩至数天
  • 多卡并行不卡顿,Instinct GPU 张量并行配置全解析