对于两条单链表,如果他们相交,则交点后的长度是相同的。
如图所示:
所以,我们需要做的是:
1.判断两条链表的长度
2.长链表和短链表相减,得到长链表和短链表对齐所需要的距离gap
3.让两个链表从同距离末尾同等距离的位置开始遍历
4.如果两个指针指向的位置相同,返回任意一个指针即可,反之返回空。
源代码:
SListNode *getIntersectionNode(SListNode *headA, SListNode *headB)
{
int lenA = 0;
int lenB = 0;
int gap;
int i;
SListNode * cur;
SListNode * longerlist = headA;
SListNode * shorterlist = headB;
for (cur = headA; cur; cur = cur->next)//求链表A的长度
{
lenA++;
}
for (cur = headB; cur; cur = cur->next)//求链表B的长度
{
lenB++;
}
gap = abs(lenA - lenB);//两条链表的长度差
if (lenA < lenB)//默认链表A比链表B长,如果B比A长,则将长指针给B,短指针给A
{
longerlist = headB;
shorterlist = headA;
}
for (i = 0; i < gap; i++)
{
longerlist = longerlist->next;
}
for (; longerlist && shorterlist; longerlist = longerlist->next, shorterlist = shorterlist->next)
{
if (longerlist == shorterlist)
{
return longerlist;
}
}
return NULL;
}