【链表】链表中环的入口结点

2023-05-16

题目描述

给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null


快慢指针法

求解链表中关于环的问题最常见的是使用快慢指针,fast指针和slow指针均从链表的头开始,fast一次走两步,slow一次走一步,若链表中有环,则fast指针会先进入环中,当 slow也进入环后,经过一定的步数,fast指针就会追上slow指针,因为每移动一次fast就离slow近一步。关于链表中和环有关的问题参考。

要找到环的入口点首先要用快慢指针计算出环的节点个数n,然后再用两个指针,其中一个指针先走n步,然后另一个指针和这个指针齐头并进,它们最终会在入口点相遇。为什么?假设链表有m个节点,则有m-n个节点不在环内,让一个指针先走n步,那么它再走m-n步就会到环的入口点,此时正好走到节点的尽头,让另一个指针和它在第n步的位置时才开始一起走,所以两个指针再走m-n步就会相遇了,相遇的地方正好是入口点。

所以要先计算出环的节点个数n,利用快慢指针,当两个指针第一次相遇后,固定其中一个指针,让另一个指针再走一圈直到和固定的指针相遇,同时记录节点的个数就能知道环的节点数了

    public ListNode EntryNodeOfLoop(ListNode pHead) {
        //快慢指针
        ListNode fast = pHead, slow = pHead;
        while (true) {
            if (fast == null)
                return null;
            slow = slow.next;
            if (slow == null)
                return null;
            fast = fast.next.next;
            if (fast == slow) {
                // 两指针相遇,计算环中节点的个数
                int num_loop = 1; //环中节点的个数
                slow = slow.next;
                while (slow != fast) {
                    slow = slow.next;
                    num_loop++;
                }
                ListNode p1 = pHead, p2 = pHead;
                // p1先走n步
                while (num_loop > 0) {
                    p1 = p1.next;
                    num_loop--;
                }
                while (p1 != p2) {
                    p1 = p1.next;
                    p2 = p2.next;
                }
                return p1;
            }
        }
    }

使用哈希表求解

另一个思路是遍历一遍链表,遍历过程中将节点存入哈希表中,每次存入时判断节点是否存在,若存在则遇到了环的起点

    public ListNode EntryNodeOfLoop(ListNode pHead) {
        HashMap<ListNode, Integer> map = new HashMap<>();
        while (true) {
            if (pHead == null)
                return null;
            if (!map.containsKey(pHead))
                map.put(pHead, 1);
            else if (map.containsKey(pHead))
                return pHead;
            pHead = pHead.next;
        }
   	}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【链表】链表中环的入口结点 的相关文章

  • 【ERROR】Failed to get convolution algorithm. This is probably because cuDNN failed to initialize

    1 有可能是显存不足 xff0c 尝试减小batchsize 2 os environ 39 TF FORCE GPU ALLOW GROWTH 39 61 39 true 39 这个语句的意思是 xff0c TensorFlow 在分配显
  • 【tensorboard】可视化模型

    关键使用tf summary trace on graph 61 True profiler 61 True 跟踪张量的流动 xff0c tf summary trace export导出图的结构 span class token keyw
  • 【python】画三维散点图Axes3D

    span class token keyword import span numpy span class token keyword as span np span class token keyword import span matp
  • 【python】输出当前时间

    span class token keyword import span time span class token keyword print span span class token punctuation span time spa
  • K8S Flannel

    1 简介 flannel是CoreOS提供用于解决Dokcer集群跨主机通讯的覆盖网络工具 它的主要思路是 xff1a 预先留出一个网段 xff0c 每个主机使用其中一部分 xff0c 然后每个容器被分配不同的ip xff1b 让所有的容器
  • 【dlib库安装】

    直接pip安装dlib库会报错 xff0c 需要先安装cmake xff0c 再安装dlib conda下可以分别使用以下命令 xff08 一行一行来 xff09 conda span class token function instal
  • 【tensorflow】tf.slice()

    tf slice inputs begin size name 是tensorflow中对向量inputs的切片 xff0c begin表示每个维度要抽取的开始位置 xff0c size表示从开始位置往后要抽取的元素个数 xff0c 若某个
  • 【Anaconda配置tensorflow2.0GPU+CUDA+CUDNN】

    创建一个新环境conda create name tf gpu python 61 3 6 xff0c python版本为3 6 xff0c 然后分别执行以下语句 xff0c conda install cupy可以自动寻找符合版本的cud
  • 【python】不同目录下导入py文件

    https zhuanlan zhihu com p 64893308
  • 【python】使用cupy加速

    cupy和numpy使用类似 xff0c 不同的是cupy在计算数组和矩阵时直接调用GPU来加速 xff0c 而numpy是调用cpu计算 在使用cupy时需要注意 xff0c cupy适合高维大尺寸的向量计算 xff0c 因为初始化GPU
  • 【点云可视化】自制ply文件并使用open3d可视化点云

    使用open3d可视化点云 xff0c 需要将点云制作为ply文件传入函数中 安装open3d 直接使用pip安装 pip span class token function install span open3d ply文件 ply文件的
  • 【python】返回列表排序索引

    arr span class token operator 61 span span class token punctuation span span class token number 1 span span class token
  • 【win10】安装pytorch1.6.0+cuda10.1 + torch-geometric

    conda下新建一个环境 xff0c 使用python3 6 conda create name torch ge span class token assign left variable python span span class t
  • 【python】制作GIF

    导入库 span class token keyword import span matplotlib span class token punctuation span pyplot span class token keyword as
  • 【3D体素可视化】

    可视化3D体素 xff0c voxel被表示为一个3维的数组 xff0c 每个位置为0或1 span class token keyword from span mpl toolkits span class token punctuati
  • OVS 使用总结

    1 简介 Open vSwitch 是一个用C语言开发的多层虚拟交换机 1 1 工作原理 内核模块实现了多个 数据路径 xff08 类似网桥 xff09 每个都可以有多个 vports xff08 类似网桥的端口 xff09 每个数据路径也
  • MySQL常用函数学习

    前言 MySQL函数是MySQL数据库提供的内置函数 xff0c 这些内置函数可以更方便处理表中的数据 下面简单介绍一下MySQL中包含的几类常用函数 聚合函数 聚合函数可实现根据一组数据求出一个值 xff0c 聚合函数的结果值只根据选定数

随机推荐

  • 【双指针(快慢指针)】链表中倒数第k个结点

    题目 输入一个链表 xff0c 输出该链表中倒数第k个结点 暴力解法 很多种 xff0c 先遍历一遍 xff0c 统计链表的长度 xff0c 让后找正数的第n k 1个节点 快慢指针 使用两个指针 xff0c fast和slow xff0c
  • 【反转链表】

    题目 输入一个链表 xff0c 反转链表后 xff0c 输出新链表的表头 题解 遍历一遍链表 xff0c 在遍历的过程中不断将指向关系反转 xff0c 可以想到需要两个指针fast和slow xff0c fast在前 xff0c slow在
  • 【python】argparse转换为字典

    在使用argparse定义程序参数时 xff0c 常规用法如下 xff1a span class token keyword import span argparse parser span class token operator 61
  • 【pytorch】多GPU训练

    使用多GPU训练pytorch模型只需要加一句DataParallel即可 xff0c 如下 span class token keyword from span torch span class token punctuation spa
  • pytorch列表添加模块

    在使用pytorch将多个模块添加到列表时不能使用简单的list xff0c 需要使用torch nn ModuleList xff0c 否则框架无法跟踪到模块且不能使用model cuda 将模型转移到GPU上 xff0c 会产生以下错误
  • 【python】将列表划分为多个子列表

    参考 将列表划分为包含3个元素的子列表 a span class token operator 61 span span class token punctuation span span class token number 1 span
  • 【pytorch】点乘、矩阵乘法

    点乘即两个相同大小的矩阵对应位置相乘 xff0c 使用torch mul a b xff0c a和b的大小需要相等 矩阵乘法需要满足矩阵乘法的原则 xff0c 使用torch matmul a b xff0c a和b需要满足矩阵乘法的规则
  • 【pytorch】1x1卷积

    对image进行1x1卷积 xff0c 输入为 b a t c h
  • VS code远程链接linux服务器开发

    https blog csdn net weixin 42864357 article details 105658765
  • 解决ValueError: Expected more than 1 value per channel when training

    出现这个问题是因为网络中存在BatchNormalization模块 xff0c 它需要多于1个数据来计算平均值 xff0c 当batch只有一个数据时会报错 如果使用pytorch xff0c 可以在获取数据集时 xff0c 将DataL
  • Etcd 入门简介

    1 简介 Etcd 是 CoreOS 基于 Raft 开发的分布式 key value 存储 xff0c 可用于服务发现 共享配置以及一致性保障 xff08 如数据库选主 分布式锁等 xff09 1 1 特性 Go 语言实现的高可靠 KV
  • 【torch.index_select】利用下标提取tensor中的值

    torch index select self Tensor dim Union str None index Tensor xff1a 第一个Tensor是被操作的tensor xff0c dim表示要操作的维度 xff0c index是
  • 【pytorch select】索引函数

    select dim index xff1a 第一个参数为索引的维度 xff0c 第二个参数为索引的维度的序列号 span class token keyword import span torch a span class token o
  • 【双y轴图】python制作双y轴图

    span class token keyword import span matplotlib span class token punctuation span pyplot span class token keyword as spa
  • Linux上安装open3d

    pip install span class token operator span span class token operator span user open3d span class token operator span pyt
  • Linux下搜索软件的安装路径

    Linux下搜索软件的安装路径 xff0c 例如 xff0c hbase span class token function whereis span hbase
  • win10+VS2017安装PCL库

    参考博客 https www jianshu com p 463f54c91ab7 https blog csdn net weixin 41991128 article details 83864713 可能出现的问题 xff1a 使用V
  • 【python】使用open3d进行mesh sampling

    span class token keyword import span open3d span class token keyword as span o3d mesh path span class token operator 61
  • 【链表】两个链表的第一个公共结点

    题目描述 输入两个链表 xff0c 找出它们的第一个公共结点 xff08 注意因为传入数据是链表 xff0c 所以错误测试数据的提示是用其他方式显示的 xff0c 保证传入数据是正确的 xff09 解法 这题首先需要理解两个链表的公共节点的
  • 【链表】链表中环的入口结点

    题目描述 给一个链表 xff0c 若其中包含环 xff0c 请找出该链表的环的入口结点 xff0c 否则 xff0c 输出null 快慢指针法 求解链表中关于环的问题最常见的是使用快慢指针 xff0c fast指针和slow指针均从链表的头