目录
1:思路
1):链表的相交从字面上很好理解,就是链表是否有交点,判断链表是否相交有多种思路,我这里介绍一种比较简单好理解的方法,A链表的节点依次跟B链表的所有节点相比较,如果A链表中的某个节点和B中的某个节点相等,那么我们就可以判断这个节点就是交点
2:解题分析
1):对上述思路进行分析后,我们这里使用的方法就很明了了,答案就是双指针,因为这里的A链表的长度和B链表的长度不相同,当我们在对A和B进行比较时我们要让A和B同时进行比较,所以这里我们就需要定义两个指针对A和B链表同时进行比较,让指针同时向后走,如果指针相等的化那指针指向的点就是交点
2):这里我们分别定义curA和curB两个指针,curA指向a1,cueB指向b2,但是A链表和B链表的长度不相等,我们怎么才能让curA指向a1的同时cueB指向b2呢?这里我们就需要让A链表的长度减去B链表的长度(B-A),就可以得到他们之间的距离差,然后再让cur2从他们的距离差出发(从b2处出发),而这时,cur1也就和cur2在同一相对距离处,也就可以让chu1和cur2同时向后走了
3:代码的实现
1):代码解析
一:首先我们先定义两个指针分别是指向A链表中a1的指针cur1、和指向B链表中b2的cur2,同时我们还需要定义两个整形变量分别是lenA和lenB,这里有一个小细节,如果令lenA和lenB为0的话就会少算一个节点的长度,但是令他们为0也并不会影响我们后续的计算,这里定义lenA和lenB以方便我们后续对A和B链表之间长度的计算,定义好以后我们用循环让curA和curB从他们各自链表的起始位置处同时向后走,直到他们的next指针指向NULL时就停止
struct ListNode* curA = headA,*curB = headB;
int lenA = 1; int lenB = 1;
while(curA->next)
{
curA = curA->next;
++lenA;
}
while(curB->next)
{
curB = curB->next;
++lenB;
}
二:这里我们需要特别判断一下curA是否等于curB,如果他们相等的化,我们这里就直接返回NULL
//尾节点不相交就是相等
if(curA != curB)
{
return NULL;
}
三:这里用一个整形gap来接收A链接(lenA)和B链接(lenB)的距离差abs(绝对值),然后再定义两个指针分别是距离长的longlist和距离短的shortlist,在定义的时候我们这里可以用到假设法,假设longlist = headA 、shortlist = headB,后面再用if来判断假设不成立时的另一种情况lenB > lenA,如果lenB > lenA,那么就让longlist = headB、shortlist = headA
//让长的先走差距步,再同时一起走,第一个相交的节点就是交点
int gap = abs(lenA - lenB);
struct ListNode* longlist = headA,*shortlist = headB;
if(lenB > lenA)
{
longlist = headB;
shortlist = headA;
}
四:接下来我们让长的(longlist)走A和B链接的gap步(差距步),走了以后curA的相对距离就等于curB了,接下来我们就可以让curA和curB同时向后走了
while(gap--)
{
longlist = longlist->next;
}
五:这里再判断一下longlist是否不等于shortlist,如果不等于就进入循环,并让curA和curB同时向后走
while(longlist != shortlist)
{
longlist = longlist->next;
shortlist = shortlist->next;
}
六:最后我们这里直接返回longlist或shortlist两个数中的任意一个数就好了
return longlist;
4:总代码
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
struct ListNode* curA = headA,*curB = headB;
int lenA = 1; int lenB = 1;
while(curA->next)
{
curA = curA->next;
++lenA;
}
while(curB->next)
{
curB = curB->next;
++lenB;
}
//尾节点不相交就是相等
if(curA != curB)
{
return NULL;
}
//让长的先走差距步,再同时一起走,第一个相交的节点就是交点
int gap = abs(lenA - lenB);
struct ListNode* longlist = headA,*shortlist = headB;
if(lenB > lenA)
{
longlist = headB;
shortlist = headA;
}
while(gap--)
{
longlist = longlist->next;
}
while(longlist != shortlist)
{
longlist = longlist->next;
shortlist = shortlist->next;
}
return longlist;
}
以上就是链表相交问题的所有分析了,创作不易,求求大家点个小赞赞,感谢各位老们的赏脸观看,随手点个赞,养成好习惯,如有问题,感谢反馈!