Leetcode 环形链表 -- 快慢指针

2023-11-08

0 题目描述

leetcode原题链接:环形链表
在这里插入图片描述

在这里插入图片描述
最容易想到的是哈希表解法,遍历所有节点,每次遍历到一个节点时,判断该节点此前是否被访问过,但是空间复杂度为 O ( n ) O(n) O(n),有以下更优的解法实现空间复杂度为 O ( 1 ) O(1) O(1)

1 快慢指针

本方法需要读者对「Floyd 判圈算法」(又称龟兔赛跑算法)有所了解。
假想「乌龟」和「兔子」在链表上移动,「兔子」跑得快,「乌龟」跑得慢。当「乌龟」和「兔子」从链表上的同一个节点开始移动时,如果该链表中没有环,那么「兔子」将一直处于「乌龟」的前方;如果该链表中有环,那么「兔子」会先于「乌龟」进入环,并且一直在环内移动。等到「乌龟」进入环时,由于「兔子」的速度快,它一定会在某个时刻与乌龟相遇,即套了「乌龟」若干圈。
我们可以根据上述思路来解决本题。具体地,我们定义两个指针,一快一满。慢指针每次只移动一步,而快指针每次移动两步。初始时,慢指针在位置 head,而快指针在位置 head.next。这样一来,如果在移动的过程中,快指针反过来追上慢指针,就说明该链表为环形链表。否则快指针将到达链表尾部,该链表不为环形链表。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

# 快慢指针
class Solution:
    def hasCycle(self, head: ListNode) -> bool:
        if not head or not head.next: return False
        slow, fast = head, head.next
        while slow != fast:
            if not fast or not fast.next: return False
            slow = slow.next
            fast = fast.next.next
        return True

2 特殊标记法

将原链表val值变为特殊值,若访问的节点val已经被变更过就是有环。

class Solution:
    def hasCycle(self, head: ListNode) -> bool:
        if not head or not head.next: 
            return False
        while head:
            if head.val == 'flag': 
                return True
            head.val = 'flag'
            head = head.next
        return False

3 结点计数法

链表中最多10000个节点,超过10000就是有环。

class Solution:
    def hasCycle(self, head: ListNode) -> bool:
        if not head or not head.next: 
            return False
        count = 0
        while head and count <= 10000:
            count += 1
            head = head.next
        return count > 10000
参考资料

环形链表
五种解题思路记录:hash表、快慢指针、链表计数、链表反转、标记val值

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

Leetcode 环形链表 -- 快慢指针 的相关文章

随机推荐

  • CNN训练细节:卷积核分解

    背景 最近看到一些分解卷积层的方法 比如三个3 3的卷积层替代一个7 7的卷积层 或者两个3乘3的卷积层替代一个5 5的卷积层 本文主要是个人粗浅的分析下原因 一 两个3乘3的卷积层替代一个5 5的卷积层 经典原理网图 如图所示 对于两层3
  • 蓝桥杯校内模拟赛题解

    蓝桥杯校内模拟赛题解 引言 本题解非官方满分题解 因此 可能存在下列问题 题意理解错误 导致答案错误 代码中存在一些问题 导致答案错误 算法复杂度的分析有误 导致不能在规定时间内得出结果 由于水平受限 本篇题解全部由 C 语言完成 题解中的
  • 自我管理的重要模型

    文章目录 前言 一 精力管理 自我管理的新旧理念 二 人类精力金字塔 精力管理四个层次 体能 情绪 思维 精神 三 运动 人类为什么喜欢躺平 每天怎么简单高效的完成20分钟的运动量 四 钟摆运动 钟摆运动对工作最大的指导意义 刻意休息 在这
  • Java 到 Go 过渡:基于 Go 开发分布式配置中心的实践

    目录 一 简介 二 Java 实现 三 Go 实现 四 从 Java 过渡到 Go 五 总结 在今天的技术世界中 从一种编程语言转向另一种是很常见的 特别是对于在企业级应用中具有广泛应用的语言如 Java 转向轻量级 效率更高的 Go 语言
  • 【因果学习】贝叶斯网络结构学习方法

    随机对照试验是发现因果关系的黄金准则 然而现实世界中很多问题往往由于道德伦理的原因不允许我们设置干预进行试验 这就引发了在观测数据上学习因果关系的需求 贝叶斯网络是概率论与图论相结合的产物 它用图论的方式直观地表达各变量之间的因果关系 为多
  • 面向对象编程(OOP):理解类、封装性的关键概念

    文章目录 对象 Object 什么是对象 面向对象 OOP 面向过程的编程语言 面向对象的编程语言 类 class 使用类创建对象的流程 类的定义 代码演示 初始化方法和实例属性 类属性和类方法 继承和多态 魔术方法 小结 类的封装性 属性
  • JSR303使用说明文档

    1 引言 参数校验是我们程序开发中必不可少的过程 用户在前端页面上填写表单时 前端js程序会校验参数的合法性 当数据到了后端 为了防止恶意操作 保持程序的健壮性 后端同样需要对数据进行校验 后端参数校验最简单的做法是直接在业务方法里面进行判
  • 大数据单机学习环境搭建(1)Hadoop本地单节点安装

    专题 大数据单机学习环境搭建和使用 1 资源获取 免费下载 2 Hadoop 本地模式 安装及文件配置 2 1安装java 2 2Hadoop安装与配置 2 3设置ssh免密登录 2 4开启hadoop 2 6访问应用 大数据单机学习环境搭
  • mysql 中使用 update 同时更新多个字段

    update 表名 set 字段1 新值1 字段2 新值2 字段3 新值3 where 条件 mysql gt select from tb person id name phone age sex description create t
  • 多机docker部署fisco-bcos区块链

    0 首先每台机器安装docker sudo yum install docker 展示一下机器环境 一共5台机器 111 203 104 97 111 203 104 113 111 203 104 114 111 203 104 116
  • 随想012:断言

    C 标准库提供了名为 assert 的断言宏 C 语言提供了名为 Debug Assert 的断言方法 Java 语言提供名为 assert 的断言关键字 主流编程语言不约而同的在语言层面上提供了 断言 机制 David R Jamson
  • linux-0.12内核之内存管理(1)

    1 内存分页管理机制 内存分页管理是通过页目录表和内存页表所组成的二级表组成的 其中页目录表和页表的结构是一样的 表项结构也相同 页目录表中的每个表项 4B 来寻址一个页表 而每个页表项 4B 来指定一页物理内存页 因此 当指定了一个页目录
  • ansys时间步长怎么设置_ANSYS瞬态动力学分析中的时间步长的选择

    对于瞬态动力学分析问题 如何选取合适的时间步长 才能保证得到正确的计算结果呢 这是我们在瞬态动力学分析中需要关注的一个问题 积分时间步长的选取决定了瞬态动力学问题的求解精度 时间步长越小 则计算精度越高 太大的时间步长会导致高阶模态的响应出
  • centos7下rpm方式安装mysql

    一 CentOS下通过rpm方式安装MySQL CentOS版本 CentOS 7 MySQL版本 MySQL 5 6 22 在网上搜了一下 Linux下安装MYSQL有三种方式 1 通过yum命令在线下载安装 2 下载离线rpm安装包安装
  • Qt应用程序的语言切换

    Qt实现软件界面显示不同的语言 是通过加载字库文件实现的 因此有三个对应的问题需要解决 如何制作字库文件 创建Qt应用程序后 在 pro文件中添加一行代码 TRANSLATIONS qmain zh ts 2 使用QtCreator菜单中的
  • Python工程或Flask项目整体加密——so加密

    python代码加密的方法有很多种 可以先进行混淆再加密 我们一般会对Flask项目或python项目的核心代码进行加密 加密方式采用so 编写一个工程加密的工具类 过程如下 1 安装依赖库 pip3 default timeout 100
  • C语言——水仙花数

    今日笔者突然有了兴致 便写一个很简单的适合于C语言初学者的程序 水仙花数定义 一个三位数i它的百位十位个位分别为a b c 若是i a 3 b 3 c 3那么该数称为水仙花数 输出100 999以内的水仙花数 代码如下 include
  • 通信OFDM相关知识总结

    子载波长度 一个OFDM symbol的时域长度 一个OFDM symbol共有64个子载波 如果按照20M的发射带宽计算的话 那么64个子载波的时域长度为64 20 3 2us 再加上保护间隔 GI guard interval 的长度为
  • Finetune方式总结

    方式一 使用Pretrain模型做约束 具体包括 直接使用Pretrain模型作为约束 使用Pretrain模型的中间层作为约束 使用Pretrain模型对不同特征注意力强度作为约束 Explicit inductive bias for
  • Leetcode 环形链表 -- 快慢指针

    0 题目描述 leetcode原题链接 环形链表 最容易想到的是哈希表解法 遍历所有节点 每次遍历到一个节点时 判断该节点此前是否被访问过 但是空间复杂度为 O n O n O n 有以下更优的解法实现空间复杂度为