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

【LeetCode 142】算法:环形链表 II

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

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

不允许修改链表。

image


要找到链表中环的入口节点,可以使用 Floyd 的循环查找算法(也称为“快慢指针”算法)。首先,我们需要确定链表中是否存在环,然后找到环的入口。这种方法不仅能够检测链表中是否存在环,还能找到环的入口节点,且不需要修改链表结构。

算法步骤:

  1. 检测环:使用快慢指针法检测链表中是否存在环。

  2. 找到环的入口:

  • 如果链表中没有环,返回 null。

  • 如果链表中有环,使用两个指针(都从链表头开始),这两个指针都以相同的速度(每次一步)移动。

  • 当这两个指针再次相遇时,它们就位于环的入口处。

复杂度分析:

  • 时间复杂度:O (n),其中 n 是链表的长度。最坏情况下,快指针需要遍历整个链表才能找到环,然后两个指针再次相遇时找到环的入口。

  • 空间复杂度:O (1),我们只需要两个指针,所以额外空间复杂度是常数级别的。

我的 Java 代码:

/*** Definition for singly-linked list.* class ListNode {*     int val;*     ListNode next;*     ListNode(int x) {*         val = x;*         next = null;*     }* }*/
public class Solution {public ListNode detectCycle(ListNode head) {if( head==null || head.next==null){return null;}ListNode slow = head;ListNode fast = head;while(fast!=null && fast.next!=null){ //检测环slow = slow.next;fast = fast.next.next;if(slow == fast){  // 发现环slow = head;  // 把慢指针指向头结点while(slow != fast){  //找到环的入口slow = slow.next;fast = fast.next;}return slow;}}return null; // 没有环}
}
http://www.vanclimg.com/news/948.html

相关文章:

  • Gin框架介绍
  • 正则表达式中的元字符
  • sequence的启动
  • L. Dynamic Convex Hull 题解
  • 实时通信技术深度对比:WebSocket与SSE的最佳实践(1018)
  • 微服务架构的轻量级解决方案(6064)
  • WebSocket服务端的高效处理(1104)
  • 服务端推送技术的现代实现(6185)
  • 异步编程在Web开发中的应用(1191)
  • 从零开始构建高性能实时聊天系统:Hyperlane框架实战指南(3242)
  • 中间件架构设计模式:从Express到现代Rust框架的演进(4232)
  • 中间件架构的优雅实现(8032)
  • Rust异步Web框架性能突破之路(1499)
  • 实战项目:文件分块上传系统(5527)
  • spring-data-JPA代码审计
  • 不同Linux发行版Node安装指南
  • 虚化引擎游戏解包工具
  • Qcom dcvs_epss.c 驱动解析.
  • AirSim+PX4+QGC实现无人机自动避障
  • js基础第五天
  • 简单了解高阻抗(High-Z)
  • docker安装
  • 二进制简史:从理论到芯片
  • js基础第四天
  • 同时点亮LED、数码管以及点阵
  • 关于跨域的一点新理解
  • js基础第三天
  • 龙哥量化:股票期货- 精华资料目录
  • 2025省选组合数学笔记
  • FM2023利兹联崛起之路#1