C++ 刷题笔记:链表相交问题详解
创作时间:
作者:
@小白创作中心
C++ 刷题笔记:链表相交问题详解
引用
CSDN
1.
https://m.blog.csdn.net/pinkpig232333/article/details/140637694
本文将带你解决一个经典的链表问题:寻找两个单链表相交的起始节点。通过详细解析题目要求、解题思路,并提供完整的C++代码实现,帮助你掌握链表操作和指针用法。
题目描述
给你两个单链表的头节点 headA 和 headB,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null。
图示两个链表在节点 c1 开始相交:
题目数据保证整个链式结构中不存在环。注意,函数返回结果后,链表必须保持其原始结构。
示例
输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
输出:Intersected at ‘8’
解释:相交节点的值为 8(注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。
在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。
解题思路
注意,先审题:是相交的节点而不是相同的值!!也就是说,当A和B的指针指向同一个地方(节点)的时候,其就是链表相交的起始节点。
解法是:
- 定义指针
curA = headA,curB = headB - 先求出两个链表其各自的长度
- 求出长度差
- 然后让
curA移动到,和curB末尾对齐的位置 - 此时我们就可以比较
curA和curB是否相同,如果不相同,同时向后移动curA和curB,如果遇到curA == curB,则找到交点 - 否则循环退出返回空指针
代码实现
#include<iostream>
#include<vector>
using namespace std;
/*链表相交*/
struct LinkedNode{
int val;
LinkedNode *next;
LinkedNode (int x):val(x),next(nullptr){}
LinkedNode(int x,LinkedNode *next):val(x),next(next){}
};
class Solution{
public:
LinkedNode *getIntersectionNode(LinkedNode *headA,LinkedNode *headB)
{
LinkedNode *curA = headA;
LinkedNode *curB = headB;
int lenA = 0;
int lenB = 0;
while(curA != nullptr)//求A链表的长度
{
lenA ++;
curA = curA->next;
}
while(curB != nullptr)//求B链表的长度
{
lenB ++;
curB = curB->next;
}
curA = headA;
curB = headB;
// 让curA为最长链表的头,lenA为其长度
if(lenB > lenA)
{
swap(lenA,lenB);
swap(curA,curB);
}
int gap = lenA - lenB;// 求长度差
// 让curA和curB在同一起点上(末尾位置对齐)
while(gap--)
{
curA = curA->next;
}
// 遍历curA 和 curB,遇到相同则直接返回
while(curA != nullptr)
{
if(curA == curB)
{
return curA;
}
curA = curA->next;
curB = curB->next;
}
return nullptr;
}
void printflist(LinkedNode *head)//打印链表
{
LinkedNode *cur = head;
while(cur != nullptr)
{
cout << cur->val <<" ";
cur = cur->next;
}
cout << endl;
}
};
int main(void)
{
Solution s;
//定义了和示例相同的两个链表
LinkedNode *tail = new LinkedNode(5,nullptr);
LinkedNode *tail1 = new LinkedNode(4,tail);
LinkedNode *tail2 = new LinkedNode(8,tail1);
LinkedNode *A3 = new LinkedNode(1,tail2);
LinkedNode *A2 = new LinkedNode(0,A3);
LinkedNode *A = new LinkedNode(5,A2);
LinkedNode *b1 = new LinkedNode(1,tail2);
LinkedNode *b = new LinkedNode(4,b1);
//打印链表
cout << "A: ";
s.printflist(A);
cout << "B: ";
s.printflist(b);
//找出两个单链表相交的起始节点并打印
LinkedNode *Node = s.getIntersectionNode(A,b1);
cout << "interdected at " << Node->val << endl;
return 0;
}
总结
这是一道链表操作的基础题目,主要考察对链表指针的使用。通过本题,可以巩固链表的基本操作,如遍历、求长度等,同时加深对指针的理解。
热门推荐
两份Excel数据如何对比数据库
发烧的类型有哪些
眉笔颜色怎么选适合自己的
揭秘Qi协议无线充电功率发展历程
平凉大锅盔:历史与美味的交织
宝可梦大集结自走棋阵容搭配攻略:高爆发、稳定输出、平民友好阵容推荐
泰山景区发布进山攻略 六条对外开放线路提前收藏
色斑如何治疗?如何预防?
这些癌症早筛误区,看完别踩雷!
揭秘预防肿瘤的最佳饮食搭配
天津之眼摩天轮:游玩攻略及实用信息
哺乳期的妈妈可以补钙吗?科学补钙指南来了
互联网经济下商家“盗图”行为的司法认定
互联网经济下商家“盗图”行为的司法认定
Win11无法识别Wmic怎么办?Win11识别不了Wmic的解决方法
鸡头米和芡实的区别是什么
吃贝母有什么禁忌吗
北京西城区确定实施多校划片 天价学区房会降价吗?
主播薪资绩效模式有哪些?
费托十年之路:纯相碳化铁催化剂开启长链α-烯烃工业化新纪元
电瓶车电瓶的几种类型及其优缺点分析
古德伍德的速度与激情,感受英国最大的复古赛车节
他们是义警,“义”心守护小城烟火气!
《魔兽世界》PLUS或加入死亡骑士:第三阵营猜想
如何在银行办理银行卡的预留信息变更?
中国邮政如何加“数”前行?
PC镜片与树脂镜片成本对比:性价比分析
手机上发票怎么验证真伪
量化交易机器人入门:如何自动化您的交易策略?
ISTP人格类型及其职业适配性分析