14链表-环形链表、龟兔赛跑算法

news/2024/7/24 2:47:31 标签: 链表, 算法, 数据结构

目录

LeetCode之路——141. 环形链表

分析:

解法一:哈希表

解法二:龟兔赛跑


LeetCode之路——141. 环形链表

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

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

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

示例 1:

img

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

示例 2:

img

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

示例 3:

img

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

提示:

  • 链表中节点的数目范围是 [0, 104]

  • -105 <= Node.val <= 105

  • pos-1 或者链表中的一个 有效索引

分析:
解法一:哈希表

1.遍历链表直到末尾,没有环返回false。

2.使用哈希表遍历存储元素,如果发现已存在节点,则有环。

public class Solution {
    public boolean hasCycle(ListNode head) {
        Set<ListNode> nodes = new HashSet<ListNode>();
        while (head != null) {
            if (!nodes.add(head)) {
                return true;
            }
            head = head.next;
        }
        return false;
    }
}
  • 时间复杂度:O(n)

  • 空间复杂度:O(n)

解法二:龟兔赛跑

也算快慢指针。龟兔赛跑就是假设乌龟和兔子在链表上移动,如果有环,兔子会先乌龟一步进入环一直循环,然后乌龟进入环的时候,兔子相对乌龟快一步,所以会遇上。如果没有环,就不会相遇。

public class Solution {
    public boolean hasCycle(ListNode head) {
        if (head == null || head.next ==null) {
            return false;
        }
        ListNode s = head;
        ListNode f = head.next;
        while (s != f) {
            if (f == null || f.next == null) {
                return false;
            }
            s = s.next;
            f = f.next.next;
        }
        return true;
    }
}
  • 时间复杂度:O(n)

  • 空间复杂度:O(1)


http://www.niftyadmin.cn/n/5067872.html

相关文章

【c语言】通讯录【动态版本:有排序和文件操作】

目录 一、通讯录定义 二、通讯录的实现 1、test.c中菜单的实现 2、通讯录的创建逻辑 3、初始化 4、检查容量和添加 5、查找 6、删除功能 7、修改功能 8、打印 9、查找并打印 10、qsort排序 11、摧毁 12、保存数据到文件 13、从文件中读数据 完整代码&#xff1a; 一、通讯录定…

如何使用 Media.io 生成不同年龄的照片

Media.io 是一个在线图片编辑器&#xff0c;提供多种功能&#xff0c;包括照片滤镜、图像裁剪和图像转换。其中&#xff0c;Media.io 的 AI 年龄转换功能可以根据上传的照片&#xff0c;生成不同年龄的照片。 使用 Media.io 生成不同年龄的照片 要使用 Media.io 生成不同年龄…

Mac 挂载 Alist网盘

挂载服务器的Alist 网盘到 Mac mac,使用的是 CloundMounter 这个软件进行挂载 http://ip:port/dav/ 需要在末尾加上 /dav/ 在一些服务器上&#xff0c;为了提供WebDAV服务&#xff0c;需要在URL地址的末尾添加"/dav/“。这是因为WebDAV协议规定了一些标准的URL路径&#x…

Python---类的定义和使用语法

定义&#xff1a; # 类的定义和使用语法 """ class 类名称: # 定义类类的属性(成员变量)类的行为(成员方法) 对象 类名称() # 创建对象 对象.类的属性 # 使用 对象.类的行为 # 使用 """# 成员方法的定义语法 #…

[论文必备]最强科研绘图分析工具Origin(2)——简单使用教程

本篇将介绍Origin的简单使用教程。 安装教程见上篇&#xff1a;[论文必备]最强科研绘图分析工具Origin&#xff08;1&#xff09;——安装教程 目录 &#x1f4e2;一、工具栏介绍 &#x1f4e3;1.1 行 1.1.1 标准栏 1.1.2 导入栏 1.1.3 工作表数据 1.1.4 图表数据 &a…

docker容器使用初体验

我们写程序时&#xff0c;都会搭建相关的环境&#xff0c;比如写了一个web&#xff0c;使用了tomcat、nginx等&#xff0c;现在想要把程序部署到云服务器或者在其他电脑上运行&#xff0c;就需要重新部署一遍环境&#xff0c;尤其是项目开源后&#xff0c;上手成本大。 docker…

SM5308 2.1A 充电 2.4 A 放电高集成度移动电源 SOC 可替代IP5306

SM5308 是一款集成升压转换器、锂电池充电管理、电池电量指示的多功能电源管理 SOC&#xff0c;为移动电源 提供完整的电源解决方案。 SM5308 的高集成度与丰富功能,使其在应用时仅需极少的外围器件,并有效减小整体方案的尺寸&#xff0c; 降低 BOM 成本。 SM5308 只需一个电…

Java架构师职责和技能

目录 1 架构师简介2 架构师职责2.1 架构师是技术领导架构设计做决策2.2 架构师可以是团队或者组织2.3 架构师必须掌握足够的技术知识2.4 架构师必须掌握足够的架构设计技能2.5 架构师必须具备很好的编程能力2.6 架构师必须深入理解业务及其业务的领域知识2.7架构师应该具备很好…