所属专栏:玩转数据结构题型
博主首页:初阳785
代码托管:chuyang785
感谢大家的支持,您的点赞和关注是对我最大的支持!!!
博主也会更加的努力,创作出更优质的博文!!
关注我,关注我,关注我,重要的事情说三遍!!!!!!!!
1.题目来源
2.题目描述
3.解题思路
- 按照题目的要求我们分两步来解题。
- 判断是否相交。
- 找到相交的节点并返回。
- 首先第一步还是挺简单的,如果两个链表相交了,所以在相交的那个节点之后的数据肯定是相同的,但是我们不知道这两个链表分别是多长的,所以无法从同时从两个链表的头节点开始遍历。而我们发现如果一一遍历的话都是会遍历到尾节点的,而如果相交的话,它们的尾节点肯定是相同的。所以我们就定义两个变量curA和curB,分别遍历两个链表,最后判断尾节点是否相同,如果相同说明相交,反之不相交。
- 而我们的第二步的话要返回相交的,而我们又不知道这两个链表的长度是都少,那有没有什么办法可以让他们的链表长度相同呢。所以我们想到了一个办法,就是我们先计算出这两个链表的长度分别是多少,然后计算出他们长度的差值,再让那个比较长的链表先走这个差值的长度,最后更长的那个链表从走到差值的节点开始遍历,而更短的链表从头节点看是遍历,这样长度就相同了。
4.代码展示
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB)
{
if(headA==NULL || headB==NULL)
return NULL;
ListNode* curA=headA,*curB=headB;
//用来计数链表元素的个数
int countA=0;
int countB=0;
//两个链表依次遍历到尾
while(curA)
{
countA++;
curA=curA->next;
}
while(curB)
{
countB++;
curB=curB->next;
}
//如果尾相同说明有相交点
if(curA==curB)
{
//假设headA更长
ListNode *longList=headA;
ListNode *shortList=headB;
//纠正长度
if(countA<countB)
{
longList=headB;
shortList=headA;
}
//计算差值
int ret=abs(countA-countB);
//更长的走差值步
while(ret--)
{
longList=longList->next;
}
//最后同时遍历,相同则是相交的节点
while(longList != shortList)
{
longList=longList->next;
shortList=shortList->next;
}
return longList;
}
else
{
return NULL;
}
}
};