🔥博客主页: 我要成为C++领域大神
🎥系列专栏:【C++核心编程】 【计算机网络】 【Linux编程】 【操作系统】
❤️感谢大家点赞👍收藏⭐评论✍️
本博客致力于分享知识,欢迎大家共同学习和交流。
给定两个单链表的头节点 headA 和 headB ,请找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
双指针
从两个链表表头开始,定义两个指针分别对链表进行遍历,求得两个长度。两个长度进行做差,绝对值记为gap。指针再分别指向两个链表的头,指向较长的链表的指针先移动差值次数,接着两个指针同时开始移动。指针相等时,即为入口结点。
流程:
①求链表长度
②求得长度差值gap
③长链表的指针移动gap距离
④双指针同时移动到相遇为止
完整代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {
if(headA ==nullptr || headB == nullptr)
return nullptr;
ListNode *pA=headA;
ListNode *pB=headB;
int aLength=1;
int bLength=1;
//遍历链表求长度
while(pA){
pA=pA->next;
aLength++;
}
while(pB){
pB=pB->next;
bLength++;
}
//求链表长度差值
int gap=abs(aLength-bLength);
//根据长度关系让两个指针在相交点相遇
pA=headA,pB=headB;
if(aLength>bLength){
while(gap){
pA=pA->next;
gap--;
}
}else{
while(gap){
pB=pB->next;
gap--;
}
}
//此时两个指针到相交点长度相同
while(pA!=pB){
pA=pA->next;
pB=pB->next;
}
if(!headA)
return nullptr;
return pA;
}
};