【Leetcode】142. 环形链表 II

2023-10-26

题目描述

在这里插入图片描述

// 142. 环形链表 II

// 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

// 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(
// 索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于
// 标识环的情况,并不会作为参数传递到函数中。

// 说明:不允许修改给定的链表。
// 进阶:
// 你是否可以使用 O(1) 空间解决此题?


题解

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
 
 
// HashSet法
// 如果借助hashset就太简单了。直接指针cur一边移动一边把结点存入set,
// 存不进去说明已经遇到重复结点,第一个遇到的重复结点就是环的入口。
// 返回当前遍历节点即可。如果cur遇到null,直接返回null

// 执行用时:4 ms, 在所有 Java 提交中击败了21.00%的用户
// 内存消耗:39.7 MB, 在所有 Java 提交中击败了5.09%的用户
import java.util.HashSet;
public class Solution {
    public ListNode detectCycle(ListNode head) {
        if (head == null || head.next == null)
            return null;
        HashSet<ListNode> set = new HashSet<>();
        ListNode cur = head;
        while (cur != null) {
            if (!set.add(cur))
                return cur;
            cur = cur.next;
        }
        return null;
    }
}

// 双指针法
// 定义intersection函数:
// 先快慢针判断是否有环,有环,快针慢针第一次相遇地点被记录,无环,返回null。
// 这个地方跟 141. 环形链表 很像,又有不同,不能用不同起点的快慢针法,必须要
// 同起点的快慢针法。
// 
// 快针慢针第一次相遇地点记录为inLoop,之后从头再构造一个指针outLoop,
// inLoop从第一次相遇地点开始走,outLoop从头开始走,两指针相遇的地点
// 一定是环形链表的环入口。返回该相遇点即可。
// 
// 执行用时:1 ms, 在所有 Java 提交中击败了32.80%的用户
// 内存消耗:38.6 MB, 在所有 Java 提交中击败了51.78%的用户
public class Solution {
    public ListNode detectCycle(ListNode head) {
        ListNode inLoop = intersection(head);
        if (inLoop == null)
            return null;
		
        ListNode outLoop = head;
        while (inLoop != outLoop) {
            inLoop = inLoop.next;
            outLoop = outLoop.next;
        }
        return inLoop;
    }

    public ListNode intersection(ListNode head) {
        if (head == null || head.next == null)
            return null;
        ListNode pre = head;
        ListNode cur = head;
        while (cur != null && cur.next != null) {
            cur = cur.next.next;
            pre = pre.next;
            if (cur == pre)
                return cur;
        }
        return null;
    }
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Leetcode】142. 环形链表 II 的相关文章

随机推荐

  • RabbitMQ系列(十)RabbitMQ进阶-Queue队列参数详解-死信交换机

    RabbitMQ进阶 Queue队列参数详解 死信交换机 文章目录 RabbitMQ进阶 Queue队列参数详解 死信交换机 1 Dead Letter Exchange 介绍 2 死信消息方式 2 1 消息被拒绝 2 1 1 channe
  • vim 使用set paste 解决多行复制粘贴乱序问题

    要粘贴的话 先set paste 然后粘贴 然后再set nopaste Reference https blog csdn net Dream Flying BJ article details 54708157
  • Ethere以太坊学习笔记

    以下不一定全 准确率99 1字节等于2gas 1 变量类型 是否是真 bool 数字类型 int uint 有符号和无符号整形 默认256 int8到uint256 地址类型 address 20字节长度 属性方法 send call ca
  • Sa-Token – 轻量级权限认证框架!

    本页目录 Sa Token介绍 相关链接 框架应用原理 接入权限框架 sa token Maven依赖 添加配置文件 配置全局异常捕获 开启Sa Token注解鉴权 添加事件监听器 添加角色认证 授权 使用Sa Token Demo 引入R
  • 【微信小程序系列:五】小程序适老化自动适配工具miniprogram-elder-transform---微信老年关怀模式下小程序字体适配微信字体

    1 先言 这个工具我网上基本找不到任何一篇文章说这个miniprogram elder transform的使用的 既然没有 那咱就自己写第一篇 Android字体大小标准默认16px iOS字体大小标准默认17px 个人觉得 微信用户设置
  • 【单目标优化算法】烟花优化算法(Matlab代码实现)

    个人主页 研学社的博客 欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 通
  • IPsec的主模式(Main mode)和积极模式(Aggressive mode)

    主模式和积极模式的信息交换机制不同 主模式有6条消息要交换 2个一组对称 主模式中 第1 2条信息中 双方交换了一些协商信息 如认证算法 hash 加密算法 DH组 认证机制等 第3 4条信息中 双方交换了公钥 在交换了公钥之后 就可以根据
  • 程序员面试什么最重要?

    来自 http www cnblogs com weidagang2046 archive 2013 02 15 on interview html 程序员面试一直是社区乐于讨论的热门话题 我自己从06年实习以来 先后经历了4家软件公司 全
  • 软件工程导论第六版 第五章 总体设计知识点总结

    目录 总体设计概述 目的 任务 设计过程 设计原理 什么是模块 什么是模块化 模块化的优点 模块化和软件成本 逐步求精 什么是逐步求精 Miller法则 抽象 信息隐藏和局部化 什么是信息隐藏 信息隐藏的优点 模块独立 耦合 内聚 内聚程度
  • XML基础入门:关于XML建模

    今天我给大家分享关于XML建模的基础 目录 今天我给大家分享关于XML建模的基础 一 什么是XML建模 就是将XML配置文件以模型的方式 进行输出操作 二 如何将XML建模 步骤 实例对象模型 1 ForwardModel 2 Action
  • 微信小程序支付

    微信小程序支付接口需要的参数timeStamp nonceStr package signType paySign openid是在登录时获取的 只需要调取token里的内容就可以了 点击事件通过cardid来判断与传值
  • 在blender中使用python脚本批量复制平移生成模型

    本案例需求 从基本的建筑单元按照字形平面布局生成综合建筑体 先在blender中用手工制作好一个建筑单元 名称定为 cube 然后在blender中打开一个 Text Editor 编辑窗口 在里面写入python脚本 import bpy
  • ImportError: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29‘ not found

    报错内容 ImportError usr lib x86 64 linux gnu libstdc so 6 version GLIBCXX 3 4 29 not found required by home lab118 anaconda
  • 图解SSL/TLS协议

    http www ruanyifeng com blog 2014 09 illustration ssl html 一 SSL协议的握手过程 开始加密通信之前 客户端和服务器首先必须建立连接和交换参数 这个过程叫做握手 handshake
  • 联想小新潮7000安装deepin 系统

    deepin 是国内比较好的开源linux操作系统 安装也比较方便 1 下载ISO镜像文件和深度启动盘制作工具 deepin官网下载ISO 启动盘制作工具下载 2 按照官网的指导 一步一步安装系统 官网指导安装过程 win10进入bios的
  • STL-set-用法

    set集合容器实现了红黑树 Red Black Tree 的平衡二叉检索树的的数据结构 在插入元素时 它会自动调整二叉树的排列 把该元素放到适当的位置 以确保每个子树根节点的键值大于左子树所有节点的键值 而小于右子树所有节点的键值 另外 还
  • 益智小游戏点灯(迷你世界lua脚本)

    点灯游戏是一个十分有趣的智力游戏 有一行N行N列的灯 开始时全部是灭的 当你点击其中一盏灯时他的上下左右 若存在的话 状态全部改变 现在要求你在限定的时间内以最少地步数 将全部的灯点亮 点灯益智游戏 作者 韩永旗 迷你号 247312290
  • Java基础读取本地txt文件

    public class TxtTest public static String txt2String File file StringBuilder result new StringBuilder try BufferedReader
  • python中冒号(:)的作用

    python中冒号 的作用 一开始接触python代码的时候冒号这个存在一直困扰了我很久 说一下我对冒号的理解 冒号 表示的就是一个整体 冒号出现在哪里就代表这个位置对整体 第一 作为整体用于输出 如在plt scatter x 0 x 1
  • 【Leetcode】142. 环形链表 II

    题目描述 142 环形链表 II 给定一个链表 返回链表开始入环的第一个节点 如果链表无环 则返回 null 为了表示给定链表中的环 我们使用整数 pos 来表示链表尾连接到链表中的位置 索引从 0 开始 如果 pos 是 1 则在该链表中