由此,我们可以知道,相交链表一定有同一个尾结点。
根据这个条件,我们可以有如下两种思路。
- 如果两个链表一样长,就可以一一对应的比较
- 怎么让链表 “一样长” 呢?
- 让链表 “对齐” (如上图)
- 那么我们需要求出链表的长度,由此得出链表gap(结点数量差)
因此,我们得出了具体的解决方案:
if((!headA)||(!headB)) //如果链表中有任意一个为空就return NULL;
return NULL;
struct ListNode* curA = headA, * curB = headB;//用curA和curB遍历链表
int countA = 0, countB = 0; //记录链表结点个数
while (curA->next)
//当curA->next为空即尾节点结束循环
//虽然最后一个结点没有被记上,但是我们最终是要得到两链表之差,所以不影响
{
countA++;
curA = curA->next;
}
while (curB->next)
{
countB++;
curB = curB->next;
}
if (curA != curB) //如果尾节点不相等则两链表不相交
return NULL;
int gap = abs(countA - countB);
//abs是算绝对值的函数,头文件是#include
这里有个小技巧,定义一个长链表和短链表,这样走的时候就让长链表先走,不然就要 if、else写两个差不多的语句。
struct ListNode* longlist = headA, * shortlist = headB;
if (countB > countA)
{
longlist = headB;
shortlist = headA;
}
while (gap--)
{
longlist = longlist->next;
}
while (shortlist)
{
if (shortlist == longlist)
return shortlist;
shortlist = shortlist->next;
longlist = longlist->next;
}
return NULL;
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB)
{
if((!headA)||(!headB))
return NULL;
struct ListNode *curA=headA,*curB=headB;
int countA=0,countB=0;
while(curA->next)
{
countA++;
curA=curA->next;
}
while(curB->next)
{
countB++;
curB=curB->next;
}
if(curA!=curB)
return NULL;
int gap=abs(countA-countB);
struct ListNode* longlist=headA,*shortlist=headB;
if(countB>countA)
{
longlist=headB;
shortlist=headA;
}
while(gap--)
{
longlist=longlist->next;
}
while(shortlist)
{
if(shortlist==longlist)
return shortlist;
shortlist=shortlist->next;
longlist=longlist->next;
}
return NULL;
}