【数据结构】链表OJ面试题4(题库+解析)

 1.前言 

前五题在这http://t.csdnimg.cn/UeggB

后三题在这http://t.csdnimg.cn/gbohQ

给定一个链表,判断链表中是否有环。http://t.csdnimg.cn/Rcdyc 

记录每天的刷题,继续坚持!

2.OJ题目训练

10. 给定一个链表,返回链表开始入环的第一个结点。 如果链表无环,则返回 NULL

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

本题是上一题(链接在上)的延续,不清楚的小码喵可以去上一篇博客观看一下。

方法一

思路

为了方便分析,我们把示例图简化一下涉及一点数学思维,大家做好准备。

我们依然按照上题来定义两个快慢指针,fast一次前进两步,slow一步

如果为环,那么fast和slow终会在环中相遇,这里假设已经相遇了。

注意以下的单位为节点数

入口点:链表开始入环的第一个节点

相遇点:fast和slow相遇的节点

假设起点到入口点长度:L
假设环的周长是:C
假设入口点到相遇点的长度是:X

由于fast走过的距离是链表起点>>入口点 + 在环中移动的圈数(必须转圈才能做到跟slow相遇)+ 入口点到相遇点的距离

slow是链表起点>>入口点 + 入口点到相遇点的距离

fast走的距离是slow的两倍,那么我们可以得出:

fast移动的距离:L+C+X

slow移动的距离:L+X

两倍关系:L+C+X=2(L+X)

但是上面fast公式的C我们要画上一个问号,因为fast可能在环中不止会转一圈,可能会转很多圈(环足够小),所以我们再改进公式得到:

fast移动的距离:L+n*C+X         n为fast在环中循环的圈数

slow移动的距离:L+X

两倍关系:L+n*C+X=2(L+X)

                

        L = n*C - X

得出关系:链表头走到起点的距离 = n倍的周长再减去相遇点到起点的距离

进而得出:一个指针从表头走,一个指针从相遇点走,那么他们会在入口点相遇!

附源代码

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
struct ListNode *detectCycle(struct ListNode *head) {struct ListNode *fast;struct ListNode *slow;fast = slow = head;while(fast&&fast->next&&slow->next){fast=fast->next->next;slow=slow->next;if(fast == slow)    //相遇{struct ListNode *tou = fast;    //相遇点,相遇时再创建节约空间while(head!=tou)    //向下继续走,直到他们相遇就是起点{head = head ->next;tou = tou -> next;}return tou; }}return NULL;    //无法相遇则不为环形链表
}

方法二

本题还有一个极为简单的解法,但是相对繁琐,我们要用到之前刷过的一题。(CV一下)

这里给大家一个链接看看大家能不能自己想出方法:160. 相交链表 - 力扣(LeetCode)

思路

我们可以利用更新奇的办法:分割链表,来把一个链表变为两个,再利用相交链表的方法来求出他们的起点。

当fast和slow相遇时,我们记录这个相遇点

之后再记录下一个点,我们就可以把相遇点断开,称为newhead

这样,环形链表,和newhead组成的表,就可以运用相交链表的方法,达到入口点既交点的节点了

如图,红色和紫色,既两个相交链表

注意事项

  • 相交链表那块要足够清楚,我们是将问题牵线搭桥到那里去的,所以要足够理解
  • 直接CV

附源代码

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*///返回相交链表相交节点的函数struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {struct ListNode *curA=headA;struct ListNode *curB=headB;int lenA=1,lenB=1;  //链表的长度至少为1while(curA->next)   //计算链表A的长度及尾节点{lenA++; //顺便计算表长curA=curA->next;}while(curB->next){lenB++;curB=curB->next;}if(curA!=curB){return NULL;    //两边的为节点不相同,那根本不是相交链表}int gap=abs(lenA-lenB); //abs为取绝对值struct ListNode *longlist=headA;    //假设A为长节点,这里我们利用替身来表示长表struct ListNode *shortlist=headB;   //就可以节省很多判断语句if(lenB>lenA)                       //若B长,侧替换{longlist=headB;shortlist=headA;}while(gap--){longlist=longlist->next;    //先走差值步}while(longlist!=shortlist)  //不等于则同时向前遍历,直到相等{longlist=longlist->next;shortlist=shortlist->next;}return longlist;    //返回第一个相等值
}//此题函数
struct ListNode *detectCycle(struct ListNode *head) {struct ListNode *fast;struct ListNode *slow;fast = slow = head;while(fast&&fast->next&&slow->next){fast=fast->next->next;slow=slow->next;if(fast == slow)    //相遇{struct ListNode *tou = fast;    //相遇点,相遇时再创建节约空间struct ListNode *newhead = tou->next; //新表头为相遇的下一个节点tou->next = NULL;   //将相遇点断开return getIntersectionNode(newhead, head);}}return NULL;    //无法相遇则不为环形链表
}

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

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

相关文章

2024年华为OD机试真题-火星文计算-Java-OD统一考试(C卷)

题目描述: 已知火星人使用的运算符为#、$,其与地球人的等价公式如下: x#y = 4*x+3*y+2 x$y = 2*x+y+3 1、其中x、y是无符号整数 2、地球人公式按C语言规则计算 3、火星人公式中,#的优先级高于$,相同的运算符,按从左到右的顺序计算 现有一段火星人的字符串报文,请…

美国服务器如何

美国服务器在被选择名单里排名很高,那么美国服务器如何,美国服务器 适用于哪些场景,认可度高吗?接下来小编为您整理发布美国服务器如何的详细情况。 美国服务器通常以其高性能、高可靠性和安全性而受到认可,它们适用于多种业务场…

【多模态大模型】GLIP:零样本学习 + 目标检测 + 视觉语言大模型

GLIP 核心思想GLIP 对比 BLIP、BLIP-2、CLIP 主要问题: 如何构建一个能够在不同任务和领域中以零样本或少样本方式无缝迁移的预训练模型?统一的短语定位损失语言意识的深度融合预训练数据类型的结合语义丰富数据的扩展零样本和少样本迁移学习 效果 论文:…

【Flask + AI】接入CHATGLM API 实现翻译接口

【Flask AI】接入CHATGLM API 实现翻译接口 最近的项目中,需要加一个翻译功能,正好chatglm4发布了,于是决定着手用它实现。 https://chatglm.cn 准备 首先,在chatglm开发者中心申请api key,这里不再赘述 其次&…

深入浅出:Golang的Crypto/SHA256库实战指南

深入浅出:Golang的Crypto/SHA256库实战指南 介绍crypto/sha256库概览主要功能应用场景库结构和接口实例 基础使用教程字符串哈希化文件哈希化处理大型数据 进阶使用方法增量哈希计算使用Salt增强安全性多线程哈希计算 实际案例分析案例一:安全用户认证系…

09 AB 10串口通信发送原理

通用异步收发传输器( Universal Asynchronous Receiver/Transmitter, UART)是一种异步收发传输器,其在数据发送时将并行数据转换成串行数据来传输, 在数据接收时将接收到的串行数据转换成并行数据, 可以实现…

代码随想录训练营29回溯part05|491、46、47

491.递增子序列 本题和大家刚做过的 90.子集II 非常像,但又很不一样,很容易掉坑里。 题目讲解:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 代码随想录文章讲解:代码随想录 视频讲解:回…

针对LLM大模型承载网发布星智AI网络解决方案

人工智能是数字经济的核心驱动力,AI 大模型是人工智能的新引擎。近年来,随着 ChatGPT 等生成式人工智能(AIGC)的突飞猛进,业内领军企业竞相推出万亿、10 万亿参数量级别的大模型,还对底层 GPU 支撑规模提出…

ad18学习笔记十八:如何放置丝印层敷铜?

我画板的时候,需要把板卡顶面丝印层的一个矩形区域,画成白色,但是这个区域内有好几个焊盘,丝印涂色的地方需要避开这几个焊盘,我觉得不能简单的在丝印层画一个矩形完事,最好让丝印层的这个区域,…

通过平扫CT实现胰腺癌早筛(平扫CT+AI)

Large-scale pancreatic cancer detection via non-contrast CT and deep learning - PubMed (nih.gov) 实验团队:海军军医大学第一附属医院(上海长海医院),放射诊断科曹凯主治医生为共同第一作者,邵成伟、陆建平等教…

Spring 的奇幻起源:从 IoC 容器到 Bean 的魔法世界 ✨

目录 什么是 Spring?为什么它如此流行? IoC 容器:从“依赖倒置”到“控制反转” Bean:IoC 容器中的基本组件 Spring 中的配置方式:XML、注解和 JavaConfig Bean 的作用域和生命周期管理 Bean 的属性装配和自动装配…

Unity类银河恶魔城学习记录4-7 P60 Counter‘s attack window 源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Enemy.cs using System.Collections; using System.Collections.Generic; …

【已解决】:pip is configured with locations that require TLS/SSL

在使用pip进行软件包安装的时候出现问题: WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available. 解决: mkdir -p ~/.pip vim ~/.pip/pip.conf然后输入内容: [global] ind…

mac电脑flutter环境配置,解决疑难问题

准备工作 首先搭建flutter的环境需要使用到flutter的sdk,可以直接跳去官网下载:Choose your first type of app - Flutter 中文文档 - Flutter 中文开发者网站 - Flutter,下载时要注意你电脑所使用的芯片是Intel的还是苹果的芯片。 下载好的…

面试 JavaScript 框架八股文十问十答第六期

面试 JavaScript 框架八股文十问十答第六期 作者:程序员小白条,个人博客 相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新! ⭐点赞⭐收藏⭐不迷路!⭐ 1)use strict是什么…

蓝桥杯Web应用开发-CSS3 新特性【练习二:获得焦点验证】

页面上有一个姓名输入框和一个密码输入框&#xff0c;当聚焦输入框时&#xff0c;输入框的背景颜色会发生改变&#xff0c; 新建一个 index3.html 文件&#xff0c;在其中写入以下内容。 <!DOCTYPE html> <html lang"en"><head><meta charset&…

16:定时器和计数器

定时器和计数器 1、定时器和计数器的介绍2、定时器是如何工作3、寄存器4、51单片机定时器简介&#xff08;数据手册&#xff09;5、定时器中的寄存器&#xff08;数据手册&#xff09;5.1、TCON&#xff08;定时器控制寄存器&#xff09;5.2、TMOD&#xff08;工作模式寄存器&a…

Python报No such file or directory: ‘science‘的解决方法

接上一篇博文&#xff1a;时间序列异常检测论文TranAD: Deep Transformer Networks for Anomaly Detection in Multivariate Time Series Data-CSDN博客 还是想看看这篇论文的可视化结果。但是当我重新运行原版代码的时候&#xff0c;会报错&#xff1a; FileNotFoundError: …

java学习06---方法

一 方法 方法&#xff08;method&#xff09;是程序中最小的执行单元 注意&#xff1a; 方法必须先创建才可以使用&#xff0c;该过程成为方法定义 方法创建后并不是直接可以运行的&#xff0c;需要手动使用后&#xff0c;才执行&#xff0c;该过程成为方法调用 二 方法的…

Mysql-数据库压力测试

安装软件 官方软件 安装插件提供了更多的监听器选项 数据库驱动 数据库测试 配置 这里以一个简单的案例进行&#xff0c;进行连接池为10,20,30的梯度压测&#xff1a; select * from tb_order_item where id 1410932957404114945;新建一个线程组 新增一个连接池配置 新建一…