力扣刷题:单链表OJ篇(下)

news2025/2/7 15:00:17

大家好,这里是小编的博客频道
小编的博客:就爱学编程

很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!!

目录

  • 1.环形链表
    • (1)题目描述
    • (2)解题思路
    • (3)复杂度分析
  • 2.环形链表2
    • (1)题目描述
    • (2)解题思路
    • (3)复杂度分析
  • 快乐的时光总是短暂,咱们下篇博文再见啦!!!如果小编的文章会对你有帮助的话不要忘了,记得给小编点赞、收藏支持一下,在此非常感谢!!!

在这里插入图片描述


废话不多说,我们直接看题。

1.环形链表

(1)题目描述

在这里插入图片描述
在这里插入图片描述


(2)解题思路

快慢指针

但要注意:最好使得快指针fast 一次走两步,慢指针slow 一次走一步使得两指针的速度之差为1 。这样就不可能会出现有环不相交的问题。

代码实现:

bool hasCycle(struct ListNode *head) {
    //快慢指针看是否会相遇,但最好快指针一次走两步,慢指针一次走一步,就不会出现有环却不相遇的情况
    struct ListNode* fast = head, * slow = head;
    if(head == NULL) return false;
    while(fast && fast->next){
        fast = fast->next->next;
        slow = slow->next;
        if(fast == slow){
            return true;
        }
    }
    return false;
}

(3)复杂度分析

  • 时间复杂度:O(N),其中 N 是链表中的节点数。
  • 空间复杂度:O(1)。我们只使用了两个指针的额外空间。

2.环形链表2

(1)题目描述

在这里插入图片描述
在这里插入图片描述


(2)解题思路

思路一:先找到相交点再把相交的点next指针指向空,这样就转变成了头指针head 和·相遇点的next 指针找交点问题。

代码实现:

 struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    if (headA == NULL || headB == NULL) {
        return NULL;
    }
    struct ListNode *p1 = headA, *p2 = headB;
    while (p1 != p2) {
        p1 = p1 == NULL ? headB : p1->next;
        p2 = p2 == NULL ? headA : p2->next;
    }
    return p1;
}

struct ListNode *detectCycle(struct ListNode *head) {
    if (head == NULL) return NULL;
    struct ListNode* fast = head, * slow = head;
    while (fast && fast->next) {
        //先走,防止因为头指针相等
        fast = fast->next->next;
        slow = slow->next;
       if (fast == slow) {
            struct ListNode* ptr = fast->next;
            fast->next = NULL;
            return getIntersectionNode(ptr, head);
        }
    }
     return NULL;
}

思路二:借助定理——两个快慢指针他们相交于环内一位置,而一指针从该位置开始走,同时另一从链表的头结点开始走,它们最终会第一次相交于环开始的那个节点。(怎么得到这个定理的一定要掌握,因为HR问到会问这个)

定理推导:

  • 我们使用两个指针,fast slow。它们起始都位于链表的头部。随后,slow 指针每次向后移动一个位置,而 fast 指针向后移动两个位置。如果链表中存在环,则 fast 指针最终将再次与 slow 指针在环中相遇。
  • 设链表中环外部分的长度为 aslow 指针进入环后,又走了 b 的距离与 fast 相遇。此时,fast 指针已经走完了环的 n 圈,因此它走过的总距离为 a + n(b + c) + b = a + (n + 1)b + nc
  • 根据题意,任意时刻,fast 指针走过的距离都为 slow 指针的 2 倍。因此,我们有a + (n + 1)b + nc = 2(a + b)⟹a = c + (n−1)(b + c)
  • 有了a = c + (n−1)(b + c)的等量关系,我们会发现:从相遇点到入环点的距离加上 n−1 圈的环长,恰好等于从链表头部到入环点的距离
  • 因此,当发现 slow fast相遇时,我们再额外使用一个指针 ptr。起始,它指向链表头部;随后,它和 slow 每次向后移动一个位置。最终,它们会在入环点相遇。

代码实现:

struct ListNode *detectCycle(struct ListNode *head) {
    //这题要做出就一定要推出一个定理:两个快慢指针他们相交于环内一位置,而一指针从该位置开始走,同时另一从链表的头结点开始走,它们最终会第一次相交于环开始的那个节点。(怎么得到这个定理的一定要掌握,因为HR问到会问这个)
    struct ListNode* fast = head, * slow = head;
    if (head == NULL) return NULL;
    while (fast && fast->next) {
        //先走,防止因为头指针相等
        fast = fast->next->next;
        slow = slow->next;
       if (fast == slow) {
        struct ListNode* ptr = head;
            while(ptr != slow){
                ptr = ptr->next;
                slow = slow->next;
            }
            return ptr;
        }
    }
     return NULL;
}

(3)复杂度分析


快乐的时光总是短暂,咱们下篇博文再见啦!!!如果小编的文章会对你有帮助的话不要忘了,记得给小编点赞、收藏支持一下,在此非常感谢!!!

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

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

相关文章

如何在idea中搭建SpringBoot项目

如何在idea中快速搭建SpringBoot项目 目录 如何在idea中快速搭建SpringBoot项目前言一、环境准备:搭建前的精心布局 1.下载jdk (1)安装JDK:(2)运行安装程序:(3)设置安装…

(源码)校园闲置交易管理系统 P10111 计算机毕业设计

项目说明 本号所发布的项目均由我部署运行验证,可保证项目系统正常运行,以及提供完整源码。 如需要远程部署/定制/讲解系统,可以联系我。定制项目未经同意不会上传! 项目源码获取方式放在文章末尾处 注:项目仅供学…

ID读卡器UDP协议Delphi7小程序开发

如下是小程序主页面: 代码如下: function isrightint(textls:string):boolean;stdcall; begintryif(strtoint(textls) 0) thenbeginend;result : True;exceptresult : False;exit;end; end; procedure TForm1.Button9Click(Sender: TObject); varsendbu…

内部类(1)

大家好,今天我们来学习一下内部类,内部类也是封装的体现,那么我们便来看看它的内容吧。 9、内部类 当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么这个内部的完整结构最好使用…

永磁同步电机无速度算法--自适应全阶滑模观测器

一、原理介绍 提出了一种改进型全阶滑模观测器的无位置传感器控制方法。首先,以准符号函数作为滑模控制函数,达到削弱抖振和提高反电动势估计性能的目的;其次,设计与电机转速相关的自适应滑模增益,以避免电机转速变化…

微软远程桌面APP怎么用

微软远程桌面(Remote Desktop)客户端(RD Client)是一款由微软开发的应用程序,允许用户通过网络连接远程访问和控制另一台计算机。同时,微软远程桌面RD Client支持多种设备和操作系统,包括Window…

phidata快速开始

文章目录 什么是phidata主要特点 安装官方demo创建一个 Web 搜索代理 PhiData开发workflow应用ToolsAgent UI 什么是phidata github: https://github.com/phidatahq/phidata 官方文档:https://docs.phidata.com/introduction Phidata is a framework for building…

考研互学互助系统|Java|SSM|VUE| 前后端分离

【技术栈】 1⃣️:架构: B/S、MVC 2⃣️:系统环境:Windowsh/Mac 3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7 4⃣️:技术栈:Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库…

王佩丰24节Excel学习笔记——第二十三讲:饼图美化与PPT图表

【以 Excel2010 系列学习,用 Office LTSC 专业增强版 2021 实践】 【本章技巧】 主次坐标柱形避让,做成左右两条柱型图的显示;饼图最多只能做2层,超过2层要使用环型图做,饼图与环形图结合可以做多层,注意&a…

从虚拟到现实:AI与AR/VR技术如何改变体验经济?

引言:体验经济的崛起 在当今消费环境中,产品与服务早已不再是市场竞争的唯一焦点,能够提供深刻感知和独特体验的品牌,往往更能赢得消费者的青睐。这种转变标志着体验经济的崛起。体验经济不仅仅是简单的买卖行为,而是通…

最新SQL Server 2022保姆级安装教程【附安装包】

目录 一、安装包下载: 下载链接:https://pan.quark.cn/s/b1c0c63d61ec 二、安装SQL Server 1.下载安装包后解压出来,双击打开 2.等待加载安装程序 3.点击基本安装 4.点击接受 5.点击浏览 6.在D盘新建文件夹 7.命名为【Sql Server】…

【GeekBand】C++设计模式笔记17_Mediator_中介者模式

1. “接口隔离” 模式 在组件构建过程中,某些接口之间直接的依赖常常会带来很多问题,甚至根本无法实现。采用添加一层间接(稳定)接口,来隔离本来互相紧密关联的接口是一种常见的解决方案。典型模式 FacadeProxyAdapte…

腾讯音乐:说说Redis脑裂问题?

Redis 脑裂问题是指,在 Redis 哨兵模式或集群模式中,由于网络原因,导致主节点(Master)与哨兵(Sentinel)和从节点(Slave)的通讯中断,此时哨兵就会误以为主节点…

WebSocket实现直播弹幕滚动推送效果

WebSocket 弹幕滚动推送 WebSocket 通信协议优点实现过程详细解析1. 初始化 WebSocket 连接2. WebSocket 事件回调2.2 连接错误 (onerror)2.3 接收到消息 (onmessage)2.4 连接关闭 (onclose)3. 心跳检测机制4. WebSocket 重新连接机制5. 滚动加载和历史数据 总结代码示例 WebS…

【C++】球弹跳高度的计算:思路分析与优化

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述输入格式输出格式输入输出示例 💯两种代码实现及其对比我的代码实现代码分析优点与不足 老师的代码实现代码分析优点与不足 💯两种实现的对…

ASP.NET Core Web API Hangfire

ASP.NET Core Web API Hangfire 前言一、安装二、相关代码1.代码片段2.代码片段3.运行效果 三、测试代码1.即发即弃作业2.延迟作业3.重复作业4.延续作业5.页面调度作业 前言 👨‍💻👨‍🌾📝记录学习成果,以…

智慧园区小程序开发制作功能介绍

智慧园区小程序开发制作功能介绍 智慧园区小程序系统作为一款面向园区企业的一站式线上服务平台,可为企业提供数智化的园区办公服务。智慧园区小程序功能介绍 1、园区公告、政策信息查看足不出户掌握最新动态,“园区公告、政策信息”等信息。首页点击对应…

Three.js Journey (notes)

Ref Three.js中文网 Three.js Journey — Learn WebGL with Three.js Part 1 first-threejs-project 1. build tools ①vite vs webpack do a bunch of things like optimizations,cache breaking,source mapping,running a local server,etc. build tool vite (most appr…

【玩转OCR】 | 腾讯云智能结构化OCR在多场景的实际应用与体验

文章目录 引言产品简介产品功能产品优势 API调用与场景实践图像增强API调用实例发票API调用实例其他场景 结语相关链接 引言 在数字化信息处理的时代,如何高效、精准地提取和结构化各类文档数据成为了企业和政府部门的重要需求。尤其是在面对海量票据、证件、表单和…

c# VS2022安装教程

换了部电脑,重新安装vs2022,做个记录给自己以后方便看 官网下载地址:下载 Visual Studio Tools - 免费安装 Windows、Mac、Linux 官网下载vs2022社区版,安装包 双击后点击继续,需要全程联网 随后出现这个界面并勾选…