每日一题——判断链表中是否有环

news2024/12/30 2:22:54

题目


判断给定的链表中是否有环。如果有环则返回true,否则返回false。

数据范围:链表长度 0≤n≤10000,链表中任意节点的值满足 ∣val∣<=100000
要求:空间复杂度 O(1),时间复杂度 O(n)

输入分为两部分,第一部分为链表,第二部分代表是否有环,然后将组成的head头结点传入到函数里面。-1代表无环,其它的数字代表有环,这些参数解释仅仅是为了方便读者自测调试。实际在编程时读入的是链表的头节点。

例如输入{3,2,0,-4},1时,对应的链表结构如下图所示:

可以看出环的入口结点为从头结点开始的第1个结点(注:头结点为第0个结点),所以输出true。

示例1

输入:
{3,2,0,-4},1
返回值:
true
说明:
第一部分{3,2,0,-4}代表一个链表,第二部分的1表示,-4到位置1(注:头结点为位置0),即-4->2存在一个链接,组成传入的head为一个带环的链表,返回true

示例2

输入:
{1},-1
返回值:
false
说明:
第一部分{1}代表一个链表,-1代表无环,组成传入head为一个无环的单链表,返回false

示例3

输入:
{-1,-7,7,-4,19,6,-9,-5,-2,-5},6
返回值:
true

思路1


使用两个指针,fast 与 slow。
它们起始都位于链表的头部。随后,slow 指针每次向后移动一个位置,而fast 指针向后移动两个位置。如果链表中存在环,则 fast 指针最终将再次与 slow 指针在环中相遇。

知识点:双指针

双指针指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个指针(特殊情况甚至可以多个),两个指针或是同方向访问两个链表、或是同方向访问一个链表(快慢指针)、或是相反方向扫描(对撞指针),从而达到我们需要的目的。

解答代码1


/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    bool hasCycle(ListNode *head) {
        if (head == nullptr) {
            return false;
        }
        // 定义快慢指针
        auto slow = head;
        auto fast = head;
        // 循环退出条件为快指针先到链表尾部
        while (fast != nullptr && fast->next != nullptr) {
            slow = slow->next;
            fast = fast->next->next;
            if (slow == fast) {
                // 快慢指针相遇表示有环
                return true;
            }
        }

        return false;
    }
};

思路2


遍历链表中的每个节点,并将它记录下来;一旦遇到了此前遍历过的节点,就可以判定链表中存在环,需借助哈希表(C++中std::unordered_set)。

但这种解法的空间复杂度为O(N),其中 N 为链表中节点的数目。因为需要将链表中的每个节点都保存在哈希表当中。

解答代码2


/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
#include <unordered_set>
class Solution {
public:
    bool hasCycle(ListNode *head) {
        if (head == nullptr) {
            return false;
        }
        auto cur = head;
        std::unordered_set<ListNode *> sets;
        while (cur != nullptr) {
            if (sets.find(cur) != sets.end()) {
                // 在unordered_set中找到了,表示有环
                return true;
            } else
                sets.emplace(cur);

            cur = cur->next;
        }
        return false;
    }
};

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

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

相关文章

关于tensorflow和pytroch安装的一些坑坑

主要是自己总结记录一下 首先tensorflow的安装 主要先参照的官网 https://docs.anaconda.com/free/anaconda/applications/tensorflow/之后我的项目是需要用到keras的&#xff0c;然后我又去安装keras&#xff0c;出现了Cannot import name ‘dtensor’ from ‘tensorflow.co…

物联网阀控水表计量准确度如何?

物联网阀控水表是一种新型的智能水表&#xff0c;它采用了先进的物联网技术&#xff0c;可以通过远程控制和监测水表的运行情况&#xff0c;实现更加精准的水量计量和费用结算。那么&#xff0c;物联网阀控水表的计量准确度如何呢&#xff1f;下面我们将从以下几个方面进行详细…

树状数组笔记

数组、前缀和、树状数组的区别&#xff1a; 数组&#xff1a;修改某点O&#xff08;1&#xff09;&#xff0c;求区间O&#xff08;n&#xff09; 前缀和&#xff1a;修改某点O&#xff08;n&#xff09;&#xff0c;求区间O&#xff08;1&#xff09; 树状数组&#xff1a;修改…

机器学习实战:Python基于GBM梯度提升机进行预测(十四)

这篇干货很硬&#xff0c;喜欢的小伙伴点个赞/收藏&#xff0c;持续更新&#xff01; 文章目录 1.前言1.1 GBM的介绍1.2 GBM的应用 2. scikit-learn实战演示2.1 分类问题2.2 回归问题 3. GBM超参数3.1 决策树数量&#xff08;n_estimators&#xff09;3.2 样本数量&#xff08…

网络设备中的配置文件管理

建立强大网络的第一步是为灾难和网络中断做好准备&#xff0c;许多企业在中断期间遭受损失&#xff0c;因为他们缺乏备份计划并且配置管理不达标&#xff0c;使用配置文件管理工具进行适当的配置文件管理不仅有助于处理网络中断&#xff0c;还有助于优化网络性能。 使用配置文…

Cilium

Cilium是一个开源的、面向Kubernetes和容器环境的网络插件&#xff0c;用于提供高级的网络和安全功能。它是一个用于容器网络和网络层四、七层安全的项目&#xff0c;旨在简化网络和安全层的管理&#xff0c;并提供高性能和低延迟的数据包处理。Cilium通过BPF&#xff08;Berke…

Windows 使用批处理脚本 kill 进程

使用 jenkins 构建 SpringBoot 项目时&#xff0c;需要增加 kill 进程的功能&#xff0c;否则再次启动时会失败&#xff0c;提示端口被占用。 Windows 平台的脚本 命令 for /f "tokens5" %%p in (netstat /anop tcp ^| findstr /i 8007 ^| findstr /i listening) do…

2023 7.24~7.30 周报 (VelocityGAN)

目录哟 0 上周回顾1 本周计划1.1 论文背景 2 完成情况2.1 背景简述2.2 网络结构: 生成器 (Generator)2.3 网络结构: 判别器 (Discriminator)2.4 损失函数: Loss2.5 OpenFWI中的VelocityGAN与它的核心代码2.5.1 判别器loss2.5.2 生成器loss2.5.3 训练的配置顺序 2.6 复现结果 3 …

【lesson3】Linux基本指令2

文章目录 echo重定向输出重定向>(输出重定向)>>(追加重定向) <(输入重定向) 生成10000行内容到file.txt命令行moremoremore -n(行数) lesslessless / 字符串 ctrl cheadheadhead -n tailtailtial -n |(管道)wcdatedatedate 其它命令 calcalcal 年份cal -1cal …

Python爬虫基础知识点有哪些

目录 Python爬虫基础知识点 Requests库 Beautiful Soup库 正则表达式 数据存储 防止被反爬虫策略 爬虫调度和任务管理 认识robots.txt文件 反爬虫法律与道德 示例代码 Requests库 Beautiful Soup库 正则表达式 数据存储 防止被反爬虫策略 结语 网络世界中信息的…

Ant Design Vue Modal 模态框位置调整

问题描述 有一个功能已经实现的需求&#xff0c;是点击了一个按钮&#xff0c;弹出了如下模态框&#xff1a; 这里看到的就是点击按钮之后用户看到的效果&#xff0c;了保持模态框在用户视野范围内&#xff0c;我钻研如何调整显示的位置。 实现步骤 Ant Design of Vue的官方…

音视频——封装格式原理

视频解码基础 一、封裝格式 ​ 我们播放的视频文件一般都是用一种封装格式封装起来的&#xff0c;封装格式的作用是什么呢&#xff1f;一般视频文件里不光有视频&#xff0c;还有音频&#xff0c;封装格式的作用就是把视频和音频打包起来。 所以我们先要解封装格式&#xff0…

【Android Framework系列】第8章 事件分发你真了解吗?

1 事件分发基本认知 1.1 事件分发的”事件“是指什么 1.2 事件处理中涉及到的点 1.3 Android 事件处理的三个流程 在Android中&#xff0c;Touch事件的分发分服务端和应用端。在服务端由WindowManagerService&#xff08;借助InputManagerService&#xff09;负责采集和分发的…

高校vr元宇宙虚拟禁毒体验推动社会戒毒工作的深入开展

元宇宙是指一个虚拟的、全球性的、可交互的虚拟世界&#xff0c;深度融合了VR虚拟现实、AR增强现实和ai等技术。将元宇宙应用于戒毒安全教育平台&#xff0c;具有以下现实意义&#xff1a; 创造安全的学习环境 戒毒安全教育需要让人们了解毒品的危害和如何预防&#xff0c;但直…

水环境综合治理监测系统:筑牢城市水生态安全屏障

水是生命之源&#xff0c;是人类赖以生存的基础。然而&#xff0c;随着工业化、城市化的快速发展&#xff0c;水污染问题日益凸显&#xff0c;给居民的环境卫生以及用水安全带来了巨大的威胁。因此&#xff0c;加强水环境综合治理&#xff0c;保护水资源和维护生态平衡&#xf…

vue之ReadIdcard(身份证读取组件)

组件功能 读取二代身份证信息组件,包含无效身份证验证,过期身份证验证,是否满16周岁验证 #界面 #界面输入项 序号输入项输入形式是否必输是否可配置备注1

CentOS 安装Oracle11g

一、方式一&#xff08;亲测&#xff09; https://blog.csdn.net/zw521cx/article/details/108550215 遇到问题解决&#xff1a; 1.执行 dbca -silent -responseFile /home/oracle/response/dbca.rsp 报错 解决办法&#xff1a; a.全局查找 [rootVM-0-8-centos ~]# locate S…

Vue全局事件总线

main.js //引入Vue import Vue from vue //引入App import App from "./App"; //关闭Vue的生产提示 Vue.config.productionTip false // const Demo Vue.extend({}) // const d new Demo() // Vue.prototype.x d//创建vm new Vue({el:#app,render:h>h(App),b…

MySQL 修改时区的方法

文章目录 什么是MySQL时区&#xff1f;通过MySQL命令模式下修改首先查看MySQL当前的时间进行修改 不方便重启MySQL&#xff0c;临时解决时区问题通过修改配置文件mysql.cnf(my.ini)来进行修改总结 环境&#xff1a;Windows10系统&#xff0c;MySQL5.7版本 mysql修改时区的方法&…

音视频——压缩原理

H264视频压缩算法现在无疑是所有视频压缩技术中使用最广泛&#xff0c; 最流行的。随着 x264/openh264以及ffmpeg等开源库的推出&#xff0c;大多数使用者无需再对H264的细节做过多的研究&#xff0c;这大降低了人们使用H264的成本。 但为了用好H264&#xff0c;我们还是要对…