哈希表题目:环形链表

news/2024/10/28 16:21:48/

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
      • 进阶
  • 解法一
    • 思路和算法
    • 代码
    • 复杂度分析
  • 解法二
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:环形链表

出处:141. 环形链表

难度

2 级

题目描述

要求

给你一个链表的头结点 head\texttt{head}head,判断链表中是否有环。

如果链表中有某个结点,可以通过连续跟踪 next\texttt{next}next 指针再次到达,则链表中存在环。评测系统内部使用 pos\texttt{pos}pos 表示链表尾结点的 next\texttt{next}next 指针连接到的结点下标(下标从 0\texttt{0}0 开始)。如果 pos\texttt{pos}pos-1\texttt{-1}-1,则在该链表中没有环。注意 pos\texttt{pos}pos 不作为参数进行传递。

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

示例

示例 1:

示例 1

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

示例 2:

示例 2

输入:head=[1,2],pos=0\texttt{head = [1,2], pos = 0}head = [1,2], pos = 0
输出:true\texttt{true}true
解释:链表中有一个环,其尾部连接到第 0\texttt{0}0 个结点。

示例 3:

示例 3

输入:head=[1],pos=-1\texttt{head = [1], pos = -1}head = [1], pos = -1
输出:false\texttt{false}false
解释:链表中没有环。

数据范围

  • 链表中结点的数目范围是 [0,104]\texttt{[0, 10}^\texttt{4}\texttt{]}[0, 104]
  • -105≤Node.val≤105\texttt{-10}^\texttt{5} \le \texttt{Node.val} \le \texttt{10}^\texttt{5}-105Node.val105
  • pos\texttt{pos}pos-1\texttt{-1}-1 或者链表中的一个有效下标

进阶

你是否可以使用 O(1)\texttt{O(1)}O(1) 空间解决此问题?

解法一

思路和算法

如果链表中存在环,则链表的尾结点的 next\textit{next}next 指针指向链表中的一个结点,被指向的结点为链表开始入环的结点。从链表的头结点 head\textit{head}head 开始遍历链表,如果链表存在环,则在访问尾结点之后会重复访问链表开始入环的结点。

如果链表中没有环,则任何结点都不会被重复访问。

因此可以遍历链表,根据是否有结点被重复访问判断链表中是否有环。为了判断是否有结点被重复访问,可以使用哈希集合存储访问过的结点。

在遍历链表的过程中将访问到的每个结点加入哈希集合。如果在遍历过程中遇到一个结点已经在哈希集合中,则链表中存在环,返回 true\text{true}true。如果遍历链表结束到达 null\text{null}null 时仍没有遇到已经在哈希集合中的结点,则链表中没有环,返回 false\text{false}false

代码

public class Solution {public boolean hasCycle(ListNode head) {Set<ListNode> visited = new HashSet<ListNode>();ListNode temp = head;while (temp != null) {if (!visited.add(temp)) {return true;}temp = temp.next;}return false;}
}

复杂度分析

  • 时间复杂度:O(n)O(n)O(n),其中 nnn 是链表的结点数。链表中的每个结点最多遍历一次。

  • 空间复杂度:O(n)O(n)O(n),其中 nnn 是链表的结点数。需要使用哈希集合存储链表中的全部结点。

解法二

思路和算法

判断链表中是否有环的另一个常用的方法是快慢指针。

初始时,快指针和慢指针都位于链表的头结点。每次将快指针移动两步,慢指针移动一步,在至少移动一次的情况下,如果快慢指针相遇则链表中存在环。

如果链表中存在环,则两个指针在移动过程中都会进入环,然后在环内移动。当两个指针都在环内移动时,一定存在一次移动,使得快指针和慢指针相遇。

如果链表中不存在环,则在至少移动一次的情况下,快指针总是在慢指针的前面,快指针将会先到达链表末尾。

由此可以使用快慢指针判断链表中是否有环。将快慢指针同时从链表的头结点开始移动,每次将快指针移动两步,慢指针移动一步,直到遇到终止条件:

  1. 至少移动一次的情况下,如果快慢指针相遇,则链表中存在环,返回 true\text{true}true

  2. 如果快指针到达链表末尾,则链表中没有环,返回 false\text{false}false

代码

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

复杂度分析

  • 时间复杂度:O(n)O(n)O(n),其中 nnn 是链表的结点数。
    如果链表中存在环,则从快慢指针都进入环到相遇的移动次数不超过环内的结点数,因此总移动次数不超过链表的结点数。
    如果链表中没有环,则快指针将到达链表末尾,移动次数不超过链表结点数的一半。

  • 空间复杂度:O(1)O(1)O(1)


http://www.ppmy.cn/news/4839.html

相关文章

2022沙丘大会 · 信创专场 GBASE告诉您金融行业数据库如何选型

12月10日&#xff0c;2022沙丘大会信创专场如期召开&#xff0c;本期专场由沙丘社区与中国信通院数据库应用创新实验室联合主办&#xff0c;GBASE南大通用技术总监冯文忠受邀出席并分享《国产数据库金融行业应用情况》主题演讲。 数据库作为金融信息系统的关键环节&#xff0…

关于小程序订单中心页设置的公告

为进一步规范小程序交易生态、提升用户购物体验、满足用户在有交易的小程序中便捷查看订单信息的诉求&#xff0c;自2022年12月31日起&#xff0c;对于有“选择商品/服务-下单-支付”功能的小程序&#xff0c;需按照平台制定的规范&#xff0c;在小程序内设置订单中心页。 开发…

C++中你不知道的namespace和using的用法

目录 引言 一: 冒号作用域 二、名字控制 1 命令空间 2 命令空间的使用 三、 using的指令 1 using的声明 2 using的编译指令 引言 你是不是只认为namespace 和 using 在C中是基本的语法框架&#xff0c;但是却不知道它们的真正用法&#xff0c;看完文章你会对using和name…

【Linux】shell 及权限理解

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《学会Linux》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;shell命令…

【Mysql】Sharding-JDBC实现读写分离、分库分表的原理分析

【Mysql】SpringBoot整合Sharding-JDBC实现读写分离、分库分表&#xff08;一&#xff09;介绍Sharding-JDBC&#xff08;1&#xff09;什么是Sharding-JDBC&#xff08;2&#xff09;Sharding-JDBC的源码是如何实现对JDBC增强的&#xff08;3&#xff09;Sharding-JDBC的分片原…

【C++进阶】C++11新特性下篇(万字详解)

&#x1f387;C学习历程&#xff1a;入门 博客主页&#xff1a;一起去看日落吗持续分享博主的C学习历程博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 也许你现在做的事情&#xff0c;暂时看不到成果&#xff0c;但不要忘记&…

计算机毕设Python+Vue校园志愿者服务系统(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【愚公系列】2022年12月 .NET CORE工具案例-PLG轻量级日志可视化服务

文章目录前言1.Serilog简介2.Grafana简介3.Loki是什么一、Serilog对接Grafana轻量级日志可视化服务1.Grafana部署2.Loki部署3.promtail部署4.测试.NET Core写入日志效果5.测试查询日志总结前言 日志功能是几乎所有程序或系统都必备的一个功能。该文章通过使用LokiGrafana来实现…