【LeetCode-简单】剑指 Offer 52. 两个链表的第一个公共节点

news/2024/11/24 0:04:23/

题目

输入两个链表,找出它们的第一个公共节点。

如下面的两个链表

在节点 c1 开始相交。

输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
输出:Reference of the node with value = 8
输入解释:相交节点的值为 8 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。

输入:intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1
输出:Reference of the node with value = 2
输入解释:相交节点的值为 2 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [0,9,1,2,4],链表 B 为 [3,2,4]。在 A 中,相交节点前有 3 个节点;在 B 中,相交节点前有 1 个节点。

输入:intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2
输出:null
输入解释:从各自的表头开始算起,链表 A 为 [2,6,4],链表 B 为 [1,5]。由于这两个链表不相交,所以 intersectVal 必须为 0,而 skipA 和 skipB 可以是任意值。
解释:这两个链表不相交,因此返回 null。

题目地址:剑指 Offer 52. 两个链表的第一个公共节点 - 力扣(LeetCode)

与另一题相同:160. 相交链表 - 力扣(LeetCode) 

方法1:栈(不华丽) 

思路

思路很简单,将两个链表分别入栈,然后出栈去比较栈顶元素,有交点的两个链表他们入栈之后的栈顶肯定是相同的,那么交点就在第一个不相同的栈顶元素的next。

代码

class Solution {ListNode getIntersectionNode(ListNode headA, ListNode headB) {if (headA==null || headB==null)return null;Stack<ListNode> stackA = new Stack<>();Stack<ListNode> stackB = new Stack<>();ListNode p1 = headA;ListNode p2 = headB;while (p1!=null){stackA.add(p1);p1 = p1.next;}while (p2!=null){stackB.add(p2);p2 = p2.next;}//最后两个节点不相同,那就是没有相交的节点if (stackA.peek()!= stackB.peek() )return null;while (!stackA.isEmpty() && !stackB.isEmpty()){if (stackA.peek()==stackB.peek()){stackA.pop();stackB.pop();continue;}else{return stackA.peek().next;}}//既然代码走到了这里,说明不是没有交点// 而是这两个栈的其中一个已经空了,那么没空的那个栈的栈顶元素.next就是交点//或者两个栈都空了if (stackA.isEmpty() && !stackB.isEmpty()){return stackB.peek().next;}else if (!stackA.isEmpty() && stackB.isEmpty()){return stackA.peek().next;}else {return headA;}}}

 这是我自己想出来的方法,过肯定能过,但是不算一个好方法。

方法2:双指针浪漫相遇

思路来自题解

剑指 Offer 52. 两个链表的第一个公共节点 - 力扣(LeetCode)

思路

思路很简单,定义两个指针分别指向两个链表的头结点,然后两个指针同步往后走,每次都比较看是否相同,如果某个指针走完了自己的链表,那就开始走另一个链表,这样总能相遇,相遇的那个节点就是相交节点。

例如:没有交点的情况,最后都会走到null,null==null,所以就返回了null,正确

再来看有交点的情况

 如果有交点且两个链表长度相同,则两指正同步走直接就能比对出来

代码

class Solution {ListNode getIntersectionNode(ListNode headA, ListNode headB) {if (headA==null||headB==null)return null;ListNode p1 = headA;ListNode p2 = headB;while (true){if (p1 == p2)return p1;if (p1 == null){p1 = headB;continue;}if (p2 == null){p2 = headA;continue;}p1 = p1.next;p2 = p2.next;}}}

 效果就比较好


http://www.ppmy.cn/news/1006020.html

相关文章

Mysql推荐使用规范

一:基础规范 1、使用InnoDB存储引擎 支持事务、行级锁、并发性能更好、CPU及内存缓存页优化使得资源利用率更高 2、推荐使用utf8mb4字符集 无需转码&#xff0c;无乱码风险, 支持emoji表情以及部分不常见汉字 3、表、字段必须加注释 方便他人理解字段意思。 4、不在数据…

Redis 安装以及配置隧道连接

目录 1.CentOS 1. 安装Redis 2. Redis 启动和停⽌ 3. 操作Redis 2.Ubuntu 1. 安装Redis 2. Redis 启动/停⽌ 3. 操作 Redis 3.开启隧道 3.1 Xshell 配置隧道 3.2 windTerm 配置隧道 3.3 FinalShell配置隧道 4.可视化客户端连接 Another Redis Desktop Manager 1.Cen…

ICN6202 MIPIDSI转LVDS桥接芯片的功能及特征 调试文档资料

产品特征功能&#xff1a; 输入&#xff1a;MIPI DSI 支持MIPI D-PHY Version 1.00.00 和 MIPI DSI Version 1.02.00. 可接收MIPI DSI 18bpp RGB666 and 24bpp RGB888 packets 4 lane data1 lane clock 4对数据线可以选择1、2、3、4lane data 每对差分数据传输线最大可…

实习周记第三周

第二周总结 第二周主要是做了一些PC端细节内容。大的地方改的不多&#xff0c;但是小的细节蛮多。 值得一提的是&#xff0c;第二周做的微信小程序&#xff0c;改了很多逻辑。改逻辑需要与后端进行联调&#xff0c;收获很大&#xff0c;思路也愈发清楚。 记录做了什么是好习…

EXCEL,多条件查询数字/文本内容的4种方法

目录 1 问题&#xff1a;如何根据多条件查询到想要的内容 2 方法总结 2.1 方法1&#xff1a; sumif() 和sumifs() 适合查找符合条件的多个数值之和 2.2 方法2&#xff1a;使用lookup(1,0/((区域1条件1)*(区域2条件2)*....),结果查询区域) 2.3 方法3&#xff1a;使用 ind…

【2种方法,jmeter用一个正则提取器提取多个值!】

jmeter中&#xff0c;用json提取器&#xff0c;一次提取多个值&#xff0c;这个很多人都会。但是&#xff0c;用正则提取器一次提取多个&#xff0c;是否可以呢&#xff1f; 肯定&#xff0c;很多人都自信满满的说&#xff0c;可以&#xff01;形如&#xff1a;token":&q…

Spring Boot、Spring Cloud、Spring Alibaba 版本对照关系及稳定兼容版本

Spring Boot、Spring Cloud、Spring Alibaba 版本对照关系及稳定兼容版本 引言 在 Java 生态系统中&#xff0c;Spring Boot、Spring Cloud 和 Spring Alibaba 是非常流行的框架&#xff0c;它们提供了丰富的功能和优雅的解决方案。然而&#xff0c;随着不断的发展和更新&…

新东方“闯”文旅,好未来“重”AI

一直以来&#xff0c;教育都是国家关注的重点&#xff0c;教育行业的任何风吹草动无时无刻不在吸引着外界的目光。虽然自前两年“双减”落地&#xff0c;在线教育行业的火热程度已经不似从前&#xff0c;但在线教育企业的转型却也还是进行得如火如荼&#xff0c;新东方、好未来…