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;
}
总结
这是一道链表操作的基础题目,主要考察对链表指针的使用。通过本题,可以巩固链表的基本操作,如遍历、求长度等,同时加深对指针的理解。
热门推荐
商业法律案例分析:公司治理结构的变革与纠纷解决
杜甫的典范之作,七言律诗的千秋鼻祖,气象雄盖宇宙
和田玉平安扣:不同颜色的含义与选择建议,如何挑选最适合自己的?
平安扣的寓意和讲究 平安扣的来历介绍
水蛭在抗血栓治疗中的应用
骆宾王简介
世界上最灵敏的实验,仍然没有发现暗物质
西瓜种植管理全攻略:从幼苗到成熟期的异常现象及防治措施
王阳明的“龙场悟道”,成为无数豪杰的指明灯
黄姓起源与分布:姓黄一般是哪里人?
蒸大虾的正确方法:时间、火候与去腥技巧全解析
散光恢复训练10个动作,简单可用,促进视力恢复,保持用眼健康!
慕斯是什麼意思?
塑胶跑道一圈是多少米?全面解读塑胶跑道的长度标准
欧盟绿卡申请条件的具体内容是什么?
筑梦新时代 巾帼绽芳华丨“她力量”绽放,筑梦教育征程
如何分析基金市场的行情?这些分析方法有哪些实际应用?
光速有限:宇宙速度与相对论的启示
爱因斯坦狭义相对论:为何光速成为宇宙不可逾越的极限?
新学期北京中小学鼓励学生花式动起来
怎样确定住房公积金的扣除限额
环保材料在展位设计中的应用与选择
生前出版诗集,捐献器官 胡少杰被授予“感动社会诗人”荣誉称号
“脑瘫诗人”胡少杰捐献器官:此时明月将休息,我做人间那道光
互相暗恋的人,多半有三种表现,彼此都能感觉到
清末民初中医脊梁丁甘仁:擂台赛扬中医威名,育人才传千古医道
宇宙中星系的数量与多样性探索:揭开星际奥秘的旅程
宇宙有多少星系?仅可观测宇宙就最少2万亿个!
常见英语系动词有哪些 具体用法是什么
开发商签合同的时间限制与法律风险防范