当前位置: 首页 > news >正文

[LeetCode]-160. 相交链表-141. 环形链表-142.环形链表II-138.随机链表的复制

目录

160.相交链表

 题目

思路

代码 

141.环形链表

 题目

思路

代码

142.环形链表II

题目

思路

代码


160.相交链表

160. 相交链表 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/intersection-of-two-linked-lists/description/

 题目

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。

图示两个链表在节点 c1 开始相交

题目数据 保证 整个链式结构中不存在环。

注意,函数返回结果后,链表必须 保持其原始结构 。

示例:

输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,6,1,8,4,5], skipA = 2, skipB = 3
输出:Intersected at '8'
解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,6,1,8,4,5]。
在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。
— 请注意相交节点的值不为 1,因为在链表 A 和链表 B 之中值为 1 的节点 (A 中第二个节点和 B 中第三个节点) 是不同的节点。换句话说,它们在内存中指向两个不同的位置,而链表 A 和链表 B 中值为 8 的节点 (A 中第三个节点,B 中第四个节点) 在内存中指向相同的位置。

思路

 先分别从两个单链表A、B的头节点开始遍历,分别计算出两个单链表的长度lenA、lenB,由于相交节点后面部分链表是共用的,所以长度差只存在于相交节点前面部分,因此,我们可以让较长的链表(可以先假设A长)先往后遍历差距步abs(lenA-lenB),再让A、B链表同时向后遍历(longlistA=longlistA->next、shortlistB=shortlistB->next),当A、B遍历到相同的节点时,即longlistA==shortlistB时,同时到达相交起始节点,返回longlist或者shortlist均为相交起始节点。

图示👇

代码 

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {struct ListNode* curA=headA;struct ListNode* curB=headB;int lenA=1,lenB=1;while(curA->next){curA=curA->next;lenA++;}while(curB->next){curB=curB->next;lenB++;}if(curA!=curB)return NULL;int grp=0;
if(lenA>lenB)
grp=lenA-lenB;
else
grp=lenB-lenA;struct ListNode* longlist=headA,* shortlist = headB;if(lenA<lenB)
{longlist=headB;shortlist=headA;
}
//长的先走差距步
while(grp--)
{longlist=longlist->next;
}
while(longlist!=shortlist)
{longlist=longlist->next;shortlist=shortlist->next;
}
return longlist;}

141.环形链表

141. 环形链表 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/linked-list-cycle/description/ 

 题目

给你一个链表的头节点 head ,判断链表中是否有环。

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

如果链表中存在环 ,则返回 true 。 否则,返回 false 。

示例:

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

思路

利用快慢指针法,在头节点创建两个指针fast和slow,从头节点向后分别开始遍历,但是fast一次走两步(fast=fast->next->next),slow一次走一步(slow=slow->next),如果链表中有环,没有指向NULL的节点,fast和slow进入环后会无限循环遍历下去,因为fast遍历速度是slow的两倍,在环中,fast和slow总会遍历到同一节点,我们就可以添加一个跳出条件,当fast和slow相等时(fast==slow),证明链表中有环,返回true。

图示👇

代码

bool hasCycle(struct ListNode *head) {struct ListNode* slow=head,* fast=head;while(fast&&fast->next){slow=slow->next;fast=fast->next->next;if(fast==slow)return true;}return false;
}

142.环形链表II

 142. 环形链表 II - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/linked-list-cycle-ii/description/

题目

给定一个链表的头节点  head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null

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

不允许修改 链表。

示例:

输入:head = [3,2,0,-4], pos = 1
输出:返回索引为 1 的链表节点
解释:链表中有一个环,其尾部连接到第二个节点。

思路

遇到环形链表问题,我们可以先考虑用快慢指针求出相遇点,在这道题中,我们要求出链表入环的第一个节点,我们知道链表成环需要尾节点指向链表中的任意节点,被指向节点就有了两个指向它的节点,我们可以利用求相交节点的方法求入环的第一个节点,类似于上面相交链表题,为了创造条件,我们可以断开相遇点,创建一个新节点newhead,和原节点head,两个节点带入上面求相交节点的题目中,就能求出入环第一个节点了。

代码

  //求相交节点的函数
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {struct ListNode* curA=headA;struct ListNode* curB=headB;int lenA=1,lenB=1;while(curA->next){curA=curA->next;lenA++;}while(curB->next){curB=curB->next;lenB++;}if(curA!=curB)return NULL;int grp=0;
if(lenA>lenB)
grp=lenA-lenB;
else
grp=lenB-lenA;struct ListNode* longlist=headA,* shortlist = headB;if(lenA<lenB)
{longlist=headB;shortlist=headA;
}
//长的先走差距步
while(grp--)
{longlist=longlist->next;
}
while(longlist!=shortlist)
{longlist=longlist->next;shortlist=shortlist->next;
}
return longlist;
}struct ListNode *detectCycle(struct ListNode *head) {struct ListNode* fast,* slow;fast=slow=head;while(fast&&fast->next){fast=fast->next->next;slow=slow->next;if(fast==slow){struct ListNode* meet=fast;//断开相遇点struct ListNode* newhead=meet->next;meet->next=NULL;//找相交节点return getIntersectionNode(newhead,head);}}return NULL;
}

相关文章:

[LeetCode]-160. 相交链表-141. 环形链表-142.环形链表II-138.随机链表的复制

目录 160.相交链表 题目 思路 代码 141.环形链表 题目 思路 代码 142.环形链表II 题目 思路 代码 160.相交链表 160. 相交链表 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/intersection-of-two-linked-lists/description/ 题目 给你两个…...

聊一聊关于手机Charge IC的电流流向

关于手机Charge&#xff0c;小白在以前的文章很少讲&#xff0c;一是这部分东西太多&#xff0c;过于复杂。二是总感觉写起来欠缺点什么。但后来想一想&#xff0c;本是抱着互相学习来写文章的心理态度&#xff0c;还是决定尝试写一些。 关于今天要讲的关于手机Charge的内容&a…...

【k8s】pod调度——亲和,反亲和,污点,容忍

官方网址&#xff1a;https://kubernetes.io/zh/docs/concepts/scheduling-eviction/assign-pod-node/ 一、亲和性 &#xff08;1&#xff09;节点亲和性 pod.spec.nodeAffinity ●preferredDuringSchedulingIgnoredDuringExecution&#xff1a;软策略 p开头 ●requiredDuri…...

分享者 - 携程旅游创作者搬砖项目图文教程

大家好&#xff01;携程这个出行旅游平台相信大家都不陌生吧。 每天都有大量的旅客在里面浏览攻略&#xff0c;寻找灵感和旅游建议。 那么&#xff0c;我们的项目就是把一些优质的小红书平台上的旅游攻略或作品&#xff0c;经过处理后搬运到携程平台上发布。 这个项目如何操作呢…...

vite配置.env环境变量文件,开发环境,测试环境,预发布环境,生产环境

在vue2&#xff0c;用的vue-cli脚手架搭建项目&#xff0c;cli用的是webpack 当你yarn dev时&#xff0c;命令会启动package.json中的dev键名的值&#xff0c;也就是后面的一行命令 这时浏览器会去识别你是开发环境还是生产环境&#xff0c;其实windows是不能直接识别你是开发…...

0003Java安卓程序设计-springboot基于Android的学习生活交流APP

文章目录 **摘** **要**目 录系统设计开发环境 编程技术交流、源码分享、模板分享、网课教程 &#x1f427;裙&#xff1a;776871563 摘 要 网络的广泛应用给生活带来了十分的便利。所以把学习生活交流管理与现在网络相结合&#xff0c;利用java技术建设学习生活交流APP&…...

Java8 时间字符串校验是否为对应的日期格式

时间字符串格式校验 严格模式下校验日期字符串 public static boolean isDateStrict(String dateStr, String pattern) {try {DateTimeFormatter formatter new DateTimeFormatterBuilder().appendPattern("yyyyMMdd").parseDefaulting(ChronoField.ERA, 1).toFor…...

2023.11.6联赛总结

T 1 T1 T1让你构造出一个不超过 40 ∗ 40 40*40 40∗40的矩阵&#xff0c;满足连续的 r y x ryx ryx有 n n n个。 一开始我想着直接放 r y x ryx ryx&#xff0c;这个做法有 80 80 80分&#xff0c;但是打挂了&#xff0c;再调了将近1个小时后&#xff0c;选择先跳过&#xff…...

UE5——源码阅读——9——引擎预初始化

加载项目模块 判断项目是否是有意义的 准备读取模块 对应着错误信息 广播 加载插件模块 根据配置是否已经启用插件 开始遍历所有的插件 尝试读取插件 检查上一次完成的加载阶段是否大于当前的加载阶段 通知加载完成...

报错Could not resolve placeholder ‘driver‘ in value “${driver}“

这是我的报错&#xff1a; 原因是我的applicationContext.xml文件加载properties文件径错误&#xff1a; 应该把路径改成这样就可以了&#xff1a;...

Rust编程基础核心之所有权(下)

1.变量与数据交互方式之二: 克隆 在上一节中, 我们讨论了变量与数据交互的第一种方式: 移动, 本节将介绍第二种方式:克隆。 如果我们 确实 需要深度复制 String 中堆上的数据&#xff0c;而不仅仅是栈上的数据&#xff0c;可以使用一个叫做 clone 的通用函数。 看下面的代码…...

高防CDN:企业网络安全的坚强后盾

随着互联网的快速发展&#xff0c;企业的网络面临着越来越多的安全威胁。在这种背景下&#xff0c;高防CDN&#xff08;Content Delivery Network&#xff09;已经成为了企业网络安全的坚强后盾。本文将理性分析高防CDN对于企业发展的影响&#xff0c;强调其在维护网络稳定性、…...

gitlab 设置 分支只读

一&#xff0c;设置master分支只读&#xff0c; 并且只有Maintainers 拥有合并权限。 二&#xff0c;设置成员权限 改为developer 三&#xff0c;邀请成员 点击右上角 Invite Members...

Spring Boot 面试题——常用注解

目录 Spring Bean将一个类声明为 Bean自动装配 Bean声明 Bean 的作用域 前端后传值处理常见的 HTTP 请求类型读取配置文件定时任务全局 Controller 层异常处理 Spring Bean 将一个类声明为 Bean Component&#xff1a;通用的注解&#xff0c;可标注任意类为 Spring 组件。如果…...

RabbitMQ(高级特性) 设置队列所有消息存活时间

RabbitMQ可以设置消息的存活时间&#xff08;Time To Live&#xff0c;简称TTL&#xff09;&#xff0c;当消息到达存活时间后还没有被消费&#xff0c;会被移出队列。RabbitMQ可以对队列的所有消息设置存活时间&#xff0c;也可以对某条消息设置存活时间。 Configuration pub…...

刷题学习记录

[MRCTF2020]PYWebsite1 进入环境&#xff0c;页面就提示要购买flag&#xff0c;不要想着购买&#xff0c;因为扫码后提示的是一个文本 “拜托&#xff01;你不会真的想PYflag吧&#xff0c;这样可是违规的&#xff01;再好好分析一下界面代码吧” 查看网页源码&#xff0c;发现…...

WPF中依赖属性及附加属性的概念及用法

完全来源于十月的寒流&#xff0c;感谢大佬讲解 依赖属性 由依赖属性提供的属性功能 与字段支持的属性不同&#xff0c;依赖属性扩展了属性的功能。 通常&#xff0c;添加的功能表示或支持以下功能之一&#xff1a; 资源数据绑定样式动画元数据重写属性值继承WPF 设计器集成 …...

Golang爬虫封装

引言 爬虫是一种自动化地从网页中提取信息的程序&#xff0c;它在现代互联网的数据获取和分析中扮演着重要的角色。Golang作为一门强大的编程语言&#xff0c;也提供了丰富的工具和库来实现爬虫功能。在本文中&#xff0c;我们将探讨如何使用Golang来封装一个灵活、高效的爬虫…...

技术分享 | 抓包分析 TCP 协议

TCP 协议是在传输层中&#xff0c;一种面向连接的、可靠的、基于字节流的传输层通信协议。 环境准备 对接口测试工具进行分类&#xff0c;可以如下几类&#xff1a; 网络嗅探工具&#xff1a;tcpdump&#xff0c;wireshark代理工具&#xff1a;fiddler&#xff0c;charles&a…...

基于前馈神经网络完成鸢尾花分类

目录 1 小批量梯度下降法 1.0 展开聊一聊~ 1.1 数据分组 1.2 用DataLoader进行封装 1.3 模型构建 1.4 完善Runner类 1.5 模型训练 1.6 模型评价 1.7 模型预测 思考 总结 参考文献 首先基础知识铺垫~ 继续使用第三章中的鸢尾花分类任务&#xff0c;将Softm…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...