《程序员面试金典(第6版)》面试题 02.08. 环路检测

news2024/10/5 13:55:11

题目描述

给定一个链表,如果它是有环链表,实现一个算法返回环路的开头节点。若环不存在,请返回 null。

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

示例 1:

在这里插入图片描述

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

示例 2:

在这里插入图片描述

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

示例 3:

在这里插入图片描述

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

进阶:

你是否可以不用额外空间解决此题?

解题思路与代码

哈希法

这道题如果是单单的判断链表是否成环,那这道题就是一道简单题,如果还要让你去返回成环的开头节点,那这道题的难度就要上升了。

对于这道题,如果我们用了哈希法,那就是降维打击,因为我们利用unordered_set就可以直接帮你返回相同节点。
具体的代码如下:

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        unordered_set<ListNode*> set;
        while(head){
            if(set.count(head)) return head;
            set.insert(head);
            head = head->next;
        }
        return nullptr;
    }
};

复杂度分析:
时间复杂度:O(n),其中n是链表节点的个数
空间复杂度:O(n),我们需要将链表的每一个节点放入集合中,所以是O(n)

快慢指针法

先解释一下这里的快慢指针法是什么意思。在这里,我们先设置两个指针,p1,p2。 p1一次走一格,p2一次走两个。因为他们走的步数不一样,所以,如果链表中有环存在了话,那么p1,p2一定不会相等。反之,如果有环,那p1,p2一定会相等。

那这道题的难点在成环节点,在距离头节点多少位置呢?首先,我们要花图分析。
在这里插入图片描述
我们设从头节点,到成环节点的距离为a。
成环节点到p2追到p1的距离为b,被追到的p1节点距离再次回到成环节点的距离为c。

再因为,p2指针一次走两格,p1指针一次走一格,p2追上p1的时候,p2走过的距离是p1的两倍。
p1被追到时p2走了a + n(b + c) + b,p1走了a + b所以不难得出这个等式:a + n(b + c) + b = 2(a + b)
将这个等式变化一下便是 **a = c + (n-1)(b+c)**么。

看着这个图,我们来翻译一个这个数学等式的意思。
假设从头节点走了a步,到达了成环节点。便等于我在相遇节点走了 c 步 + n圈。
我们在p1节点与p2节点相遇的时候,再去设置一个p3节点让它等于头节点。这个时候,p3也一次走一步。
你看图,当p3在头节点走了a步的时候,是不是正好与p1在b的时候走了c步呢?

现在,我们是不是就可以写代码了。

代码如下:

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        ListNode* p1 = head;
        ListNode* p2 = head;
        while(p2){
            p1 = p1->next;
            if(p2->next)
                p2 = p2->next->next;
            else return nullptr;
            if(p1 == p2) {
                ListNode* p3 = head;
                while(p3!=p1){
                    p1 = p1->next;
                    p3 = p3->next;
                }
                return p3;
            }
        }
        return nullptr;
    }
};

复杂度分析:
时间复杂度:O(N),N为节点的长度。因为你在实际推演的过程中会发现,p1指针走过的最长的路程也不会超过链表中节点的个数,而是等于节点的个数,所以时间复杂度是O(N)
空间复杂度:O(1),我们设置了几个变量而已,没有使用额外的数据结构,所以是O(1)。

总结

这道题的普通做法,实在是没有什么难度,只要你能想起来有unordered_set等哈希的数据结构。这道题就是简单中的简单。但是如果你想要实现进阶版的难度,需要你具有一定的数学推导能力,和发现美的眼睛。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/391400.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如果想了解营销的最高境界,请看如何开创新品类?

如果想了解营销的最高境界&#xff0c;请看 如何开创新品类&#xff1f; 中国奶粉第一品牌飞鹤奶粉&#xff5e; 品牌策划人王博总结的方法 趣讲大白话&#xff1a;看看高手怎么想 【安志强趣讲信息科技95期】 ******************************* 不懂品牌营销的程序员不是好厨师…

第一次使用Python for Qt中的问题

在创建带有form的python for qt的时候&#xff0c;使用的库是pySide6&#xff0c;而不是pyqt。 因此&#xff0c;需要安装pyside6。 Running "/usr/bin/python3 -m pip install PySide6 --user" to install PySide6. ERROR: Could not find a version that satisfi…

hivesql实现不同的求和需求【分组求和、帕累托累计求和、滑动求和】

hivesql求和&#xff0c;分组求和&#xff0c;帕累托累计求和&#xff0c;滑动求和 实现功能如下示例&#xff1a; 列s1&#xff1a;分组求和&#xff0c;这里以sku_id分组求和&#xff0c;E5单元格对应sku_ida01时的C列求和&#xff1b; 列s2&#xff1a;帕累托求和&#x…

X264简介-Android使用(一)

X264 简介及使用 1、简介 2、环境搭建 3、使用 4、小结 简介 官网连接&#xff1a;https://www.videolan.org/developers/x264.html 官方文档&#xff1a;https://wiki.videolan.org/Category:X264/ x264是用于编码H.264/MPEG-4 AVC视频流的免费软件库。它世界上最流行的…

每天一个linux命令:性能监控和优化命令之top

top命令是Linux下常用的性能分析工具&#xff0c;能够实时显示系统中各个进程的资源占用状况&#xff0c;类似于Windows的任务管理器。下面详细介绍它的使用方法。top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止…

将fluentMeshing网格转换为openFoam网格

简介 fluentMeshing是一个绘制源生多面体网格的强大工具&#xff0c;其生成的网格可以进一步导出&#xff0c;转换为OpenFoam格式&#xff0c;供OpenFoam计算。 本文将介绍如何把fluentMeshing网格转换为openFoam网格&#xff0c;以及其注意事项 步骤 &#xff08;1&#x…

【QML】锚布局

文章目录1、锚&#xff08;Anchors&#xff09;2、一些示例Qt Quick中有两套与布局管理相关的类库&#xff0c;一种是Item Positioner&#xff08;定位器&#xff09;&#xff0c;一种是Item Layout&#xff08;布局&#xff09; 定位器&#xff1a;Row&#xff08;行定位器&am…

【NLP经典论文阅读】Efficient Estimation of Word Representations in Vector Space(附代码)

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️&#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

UE4 c++ Mediaplayer取消自动播放,运行时首帧为黑屏的问题

0&#xff0c;前言 工作需要使用C制作一个ue4的视频插件&#xff0c;其中一个功能是能够选择 运行时是否自动播放 视频的功能。 在实现时遇见了一个问题&#xff0c;取消自动播放之后&#xff0c;运行时首帧是没有取到的&#xff0c;在场景里面看是黑色的。就这个问题我想到了使…

Kubernetes k8s 笔记

核心功能 容器编排和管理&#xff1a;Kubernetes可以自动化容器的部署、管理和扩展&#xff0c;使得应用程序可以在多个容器之间进行平滑的切换。自动化负载均衡&#xff1a;Kubernetes可以通过将请求分配到不同的容器来平衡负载&#xff0c;以确保应用程序的高可用性和性能。…

【大数据离线开发】8.4 Hive的查询、操作以及自定义函数

8.5 Hive的查询 执行SQL&#xff08;HQL&#xff09;。HQL是SQL的一个子集 案例&#xff1a;创建部门表&#xff0c;对数据进行查询 创建部门表 create table deptno(deptno int,dname string,loc string ) row format delimited fileds terminated by ,;导入数据 load data…

函数式编程:Lambda 表达式

函数式编程&#xff1a;Lambda 表达式 每博一文案 曾经读过的依然令我感动的句子&#xff0c;生活总是不如意&#xff0c;但往往是在无数痛苦中&#xff0c;但往往是在无数痛苦中&#xff0c;在重重矛盾 和艰难中才能成熟起来&#xff0c;坚强起来&#xff0c;爱情啊&#xf…

JMeter 控制并发数

文章目录一、误区二、正确设置 JMeter 的并发数总结没用过 JMeter 的同学&#xff0c;可以先过一遍他的简单使用例子 https://blog.csdn.net/weixin_42132143/article/details/118875293?spm1001.2014.3001.5501 一、误区 在使用 JMeter 做压测时&#xff0c;大家都知道要这么…

又拍云邵海杨 - 25年Linux老兵,聊聊运维的“术”与“道”

您好邵总&#xff0c;请您先做个自我介绍吧&#xff0c;聊聊您的履历和现状&#xff0c;让大家更好的认识您&#xff0c;了解您的背景也有助于读者理解后面的采访内容 我是来自又拍云的邵海杨&#xff0c;从1998年开始使用Linux至今快25年了&#xff0c;资深(老鸟)Linux系统运维…

Log Structure Merge Tree

LSM是一种基于日志追加写的数据结构&#xff0c;非常适合为具有高写入数据提供索引访问 LSM基于以下前提 内存读写速度远高于磁盘&#xff0c;但内存有限磁盘顺序读写速度远高于随机读写 结构 WAL WAL(write-ahead log)是用于在系统错误时提供持久化&#xff0c;在写入数据…

SpringBoot自动装配原理、条件注解及封装Starter

1.什么是 SpringBoot 自动装配&#xff1f; 我们现在提到自动装配的时候&#xff0c;一般会和Spring Boot联系在一起。但是实际上SpringFramework 早就实现了这个功能。Spring Boot 只是在其基础上&#xff0c;通过 SPI 的方式&#xff0c;做了进一步优化。 SpringBoot 定义了…

C++之string字符串不同类型间转换

&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3; ✏️作者主页&#xff1a;枫霜剑客 &#x1f4cb; 系列专栏&#xff1a;C实战宝典 &#x1f332;上一篇: VS2019加载解决方案时不能自动打开之前的文档&#xff08…

pytorch 笔记:torch.fft

1 FFT 进行一个维度的快速傅里叶变换 torch.fft.fft(input, nNone, dim- 1, normNone, *, outNone) 1.1 主要参数 input输入&#xff0c;需要傅里叶变换的tensorn 需要变换的tensor的长度&#xff0c;默认是input的长度 如果比input长度大&#xff0c;那么补0如果比input长度…

乐山持点科技:抖音极速版电商入驻指南

“抖音极速版电商”拥有海量活跃用户&#xff0c;着眼下沉市场&#xff0c;为消费者带来高性价比产业带源头好货。针对中小商家设立更宽松的经营要求、提供简单易上手的经营工具&#xff0c;助力商家轻松经营&#xff01;来看入驻指南&#xff1a;一、抖音与抖音极速版电商入驻…

JavaScript基础五、语句

零、文章目录 文章地址 个人博客-CSDN地址&#xff1a;https://blog.csdn.net/liyou123456789个人博客-GiteePages&#xff1a;https://bluecusliyou.gitee.io/techlearn 代码仓库地址 Gitee&#xff1a;https://gitee.com/bluecusliyou/TechLearnGithub&#xff1a;https:…