当前位置:网站首页>力扣160题,相交链表
力扣160题,相交链表
2022-08-01 12:33:00 【瀛台夜雪】
力扣160题,相交链表
题目描述
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。
图示两个链表在节点 c1 开始相交:
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
自定义评测:
评测系统 的输入如下(你设计的程序 不适用 此输入):
intersectVal - 相交的起始节点的值。如果不存在相交节点,这一值为 0
listA - 第一个链表
listB - 第二个链表
skipA - 在 listA 中(从头节点开始)跳到交叉节点的节点数
skipB - 在 listB 中(从头节点开始)跳到交叉节点的节点数
评测系统将根据这些输入创建链式数据结构,并将两个头节点 headA 和 headB 传递给你的程序。如果程序能够正确返回相交节点,那么你的解决方案将被 视作正确答案 。
输入输出样例
输入: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 个节点。
输入:intersectVal = 2, listA = [1,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1
输出:Intersected at '2'
解释:相交节点的值为 2 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [1,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 。
解法一:使用hash进行处理
//算法一:使用hash表进行查找相交的链表
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB)
{
if(!headA||!headB)
{
return nullptr;
}
//建立hash表保存headA所有的结点
unordered_set<ListNode *>uset;
ListNode *tempNodeA=headA;
while(tempNodeA)
{
uset.insert(tempNodeA);
tempNodeA=tempNodeA->next;
}
//建立临时指针指向headB的结点
ListNode *tempNodeB=headB;
while(tempNodeB)
{
if(uset.count(tempNodeB))
{
return tempNodeB;
}
tempNodeB=tempNodeB->next;
}
return nullptr;
}
解法二,使用双指针的方法,时间复杂度为O(m+n),空间为O(1)
//解法二,使用双指针的方法,两个指针指向两个链表,谁先遍历完便指向另一个链表,直到两个指针都为空或则两个指针找到相同的值
ListNode *getIntersectionNode2(ListNode *headA, ListNode *headB)
{
if(!headA||!headB)
{
return nullptr;
}
//建立临时结点指向headA,headB
ListNode *tempNodeA,*tempNodeB;
tempNodeA=headA;
tempNodeB=headB;
while(tempNodeA!=tempNodeB)
{
if(tempNodeA)
{
tempNodeA=tempNodeA->next;
}
else{
tempNodeA=headB;
}
if(tempNodeB)
{
tempNodeB=tempNodeB->next;
}
else{
tempNodeB=headA;
}
}
return tempNodeA;
}
边栏推荐
- 《MySQL核心知识》第6章:查询语句
- js中常用追加元素的几种方法:append,appendTo,after,before,insertAfter,insertBefore,appendChild
- [5 days countdown] to explore the secret behind the great quality promotion, gift waiting for you to take of $one thousand
- (ES6以上以及TS) Map对象转数组
- 关于亚马逊测评,你了解多少?
- Data frame and remote frame of CAN communication
- JS 中的 undefined 和 null 的区别
- Excel表格打印时不打印标记填充颜色
- 【面试高频题】难度 1.5/5,二分经典运用题
- 软件设计师考点汇总(室内设计师个人总结)
猜你喜欢
STM32 CAN filter configuration details
找出相同属性值的对象 累加数量 汇总
达梦更换正式授权dm.key
win10系统重装,无法登录进行同步的情况下chrome数据恢复
The CAN communication standard frame and extended frame is introduced
如何使用 Authing 单点登录,集成 Discourse 论坛?
【倒计时5天】探索音画质量提升背后的秘密,千元大礼等你来拿
这项工作事关中小学生生命安全!五部门作出联合部署
Pytest e-commerce project combat (below)
故障007:dexp导数莫名中断
随机推荐
MMF的初步介绍:一个规范化的视觉-语言多模态任务框架
How to use DevExpress controls to draw flowcharts?After reading this article, you will understand!
蔚来又一新品牌披露:产品价格低于20万
MVVM响应式
实现集中式身份认证管理的案例
AI目标分割能力,无需绿幕即可实现快速视频抠图
[Community Star Selection] Issue 24 August Update Plan | Keep writing, refuse to lie down!More original incentive packages, as well as Huawei WATCH FIT watches!
Aeraki Mesh became CNCF sandbox project
一文带你读懂云原生、微服务与高可用
CAN通信标准帧和扩展帧介绍
阿里云官方 Redis 开发规范
库函数的模拟实现(strlen)(strcpy)(strcat)(strcmp)(strstr)(memcpy)(memmove)(C语言)(VS)
安全又省钱,“15岁”老小区用上管道燃气
【公开课预告】:超分辨率技术在视频画质增强领域的研究与应用
如何利用DevExpress控件绘制流程图?看完这篇文章就懂了!
Pytest电商项目实战(下)
【面试高频题】难度 1.5/5,二分经典运用题
What is MNIST (what does plist mean)
bpmn-process-designer基础上进行自定义样式(工具、元素、菜单)
表连接详解