当前位置:网站首页>2022.08.01_每日一题
2022.08.01_每日一题
2022-08-05 11:48:00 【诺.い】
剑指 Offer 52. 两个链表的第一个公共节点
题目描述
输入两个链表,找出它们的第一个公共节点。
如下面的两个链表:
在节点 c1 开始相交。
示例 1:
输入: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 个节点。
示例 2:
输入: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 个节点。
示例 3:
输入: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。
注意:
- 如果两个链表没有交点,返回
null
. - 在返回结果后,两个链表仍须保持原有的结构。
- 可假定整个链表结构中没有循环。
- 程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。
- 本题与主站 160 题相同:https://leetcode-cn.com/problems/intersection-of-two-linked-lists/
coding
1. 借用 List 存储,然后遍历另一条链表,通过判断节点是否已存在,判断是否相交
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */
class Solution {
ListNode getIntersectionNode(ListNode headA, ListNode headB) {
List<ListNode> list = new ArrayList<>();
ListNode cur1 = headA;
while (cur1 != null) {
list.add(cur1);
cur1 = cur1.next;
}
ListNode cur2 = headB;
while (cur2 != null) {
if (list.contains(cur2)) {
return cur2;
}
cur2 = cur2.next;
}
return null;
}
}
2. 如果两链表相交,则结尾部分必然相同,节点数量也相同,先把开头部分必然不可能相交的节点过滤
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */
class Solution {
ListNode getIntersectionNode(ListNode headA, ListNode headB) {
// 记录两条链表的长度
int len1 = 0, len2 = 0;
ListNode cur1 = headA;
while (cur1 != null) {
len1 ++;
cur1 = cur1.next;
}
ListNode cur2 = headB;
while (cur2 != null) {
len2 ++;
cur2 = cur2.next;
}
ListNode temp1 = len1 > len2 ? headA : headB;
ListNode temp2 = len1 > len2 ? headB : headA;
int cnt = Math.abs(len1 - len2);
// 把链表长度较长的temp1把多余的长度过滤(相交必然导致共有部分的节点数量是一样多的)
while (cnt-- > 0) {
temp1 = temp1.next;
}
// 剩余节点数量相同时,遍历结尾部分的节点判断是否存在相交的情况(temp1 == temp2)
while (temp1 != null) {
if (temp1 == temp2) {
return temp1;
}
temp1 = temp1.next;
temp2 = temp2.next;
}
return null;
}
}
边栏推荐
- [7.29-8.5] Review of wonderful technical blog posts in the writing community
- 高泽龙出席博鳌全球旅游生态大会 讲元宇宙与未来网络科技
- 解决 cuDNN launch failure 错误
- LeetCode brush questions (8)
- Three.js 点击模型,高亮发光模型外轮廓
- nyoj1185最大最小值(线段树)
- Web3 中的安全问题和防范
- 2022杭电多校联赛第六场 题解
- Cesium.js 地形挖洞
- 莅临GOPS大会龙智展位,获取Forrester最新报告:《Forrester Wave:2021年第四季度企业服务管理报告》
猜你喜欢
Go compilation principle series 9 (function inlining)
SonarQube即将亮相第十八届GOPS全球运维大会
再获殊荣 | 赛宁网安入选2022年度“培育独角兽”企业榜单
小红的aba子序列(离散化、二分、dp维护区间最短)
Visit GOPS Long Zhi booth, Forrester's latest report: "the Forrester Wave: the fourth quarter of 2021 enterprise service management report
普通二本毕业八年,京东就职两年、百度三年,分享大厂心得
Android development with Kotlin programming language II Conditional control
机器学习——集成学习
5G NR system messages
五大理由告诉你为什么开发人员选择代码质量静态分析工具Klocwork来实现软件安全
随机推荐
power failure...Trouble trouble trouble!!!
使用Netty编写通用redis客户端(可指定服务器地址与端口号连接任意redis)
Flink Yarn Per Job - 启动TM,向RM注册,RM分配solt
shell编程流程控制练习
nyoj757 期末考试 (优先队列)
hdu1455 Sticks (search+pruning+pruning+.....+pruning)
解决 json.dump 报错:TypeError - Object of type xxx is not JSON serializable
UDP communication
不是吧?还有人不会定位线上MySQL慢查询问题?
碘乙酰胺在Desthiobiotin-Iodoacetamide试剂中的作用?
No developers, received a job to develop an IoT system, do you want to do it?
软件设计七大原则之开闭原则(Open-Closed Principle, OCP)
Four, kubeadm single master
Go compilation principle series 9 (function inlining)
小红的aba子序列(离散化、二分、dp维护区间最短)
Byte Qiu Zhao confused me on both sides, and asked me under what circumstances would the SYN message be discarded?
课表小程序使用攻略
分布式事务解决方案
Cesium.js 地形挖洞
冬日里,28℃的爱情