链表相交问题详解

目录

目录

1:思路

 2:解题分析

3:代码的实现 

1):代码解析

4:总代码


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;
}

以上就是链表相交问题的所有分析了,创作不易,求求大家点个小赞赞,感谢各位老们的赏脸观看,随手点个赞,养成好习惯,如有问题,感谢反馈!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值