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

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

142环形链表II

题目描述

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

做题思路

这道题实际就做两件事:
第一件事是检查链表是否有环
第二件事是寻找链表的入口

  1. 检查链表是否有环如环形链表I一样,通过快慢指针来实现,当快指针的nextnext.next不为null的时候就一直进行while循环,快指针一次走两步,慢指针一次走一步,如果快慢指针相遇则说明有环,否则无环;
  2. 寻找链表入口涉及到一个巧妙的数学证明,这个数学证明的结论是:当快慢指针相遇后,定义一个指针从头节点出发,同时一个指针从快慢指针相遇处出发,当这两个指针相遇的时候,就代表走到了环形链表的入口处,这个数学证明如下图,应试的话记结论就行:

在这里插入图片描述

代码

/**
 * 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) {
        ListNode slowNode = head;
        ListNode fastNode = head;
        while (fastNode != null && fastNode.next != null) {
            slowNode = slowNode.next;
            fastNode = fastNode.next.next;
            if (slowNode == fastNode) {
                ListNode cur = head;
                while (cur != slowNode) {
                    cur = cur.next;
                    slowNode = slowNode.next;
                }
                return cur;
            }
        }
        return null;
    }
}

http://www.kler.cn/a/383069.html

相关文章:

  • ArcGIS Pro 3.4新功能3:空间统计新特性,基于森林和增强分类与回归,过滤空间自相关
  • Jenkins 任意文件读取(CVE-2024-23897)修复及复现
  • Linux网络——网络基础
  • 010 Qt_输入类控件(LineEdit、TextEdit、ComboBox、SpinBox、DateTimeEdit、Dial、Slider)
  • 重温设计模式--组合模式
  • LAUNCHXL_F28379D_Workspace_CCS124
  • 开放寻址法、链式哈希数据结构详细解读
  • Vue3 + Element Plus简单使用案例及【eslint】报错处理
  • 【漏洞复现】Apache Druid RCE (CVE-2023-25194) 漏洞
  • Linux与Windows中的流量抓取工具:wireshark与tcpdump
  • 防火墙|WAF|漏洞|网络安全
  • 【LeetCode】【算法】215. 数组中的第K个最大元素
  • 内外连接【MySQL】
  • 机器学习(三)——决策树(附核心思想、重要算法、概念(信息熵、基尼指数、剪枝处理)及Python源码)
  • Flutter UI构建渲染(4)
  • Windows10/11下python脚本自动连接WiFi热点
  • STM32启动文件分析
  • Axure是什么软件?全方位解读助力设计入门
  • 实践是认识的来源
  • GPU的内存是什么?
  • 继承——面向对象编程的基石
  • 【C++】lambda表达式的理解与运用(C++11新特性)
  • [C++ 核心编程]笔记 4.4.2 类做友元
  • 【Vue 2.x】之指令详解
  • Nat Med 病理AI系列|人工智能在肝病临床试验中的应用·顶刊精析·24-11-06
  • QT开发:掌握现代UI动画技术:深入解析QML和Qt Quick中的动画效果