题目描述:如下面的两个链表:
在节点 c1 开始相交。
解题思路:
首先需要考虑两个链表长度不一样的情况(如果两链表长度相同就当然不需要考虑):这里就需要用到链表的右对齐思想。先找到两个链表中的长链表和短链表。分别让两个指针指向两个链表,让长的链表的指针先走(长链表长度-短链表长度)步,这样就相当于跳过了较长链表的多余部分,则此时两指针遍历完链表所走长度应该是相同的,这就是右对齐思想。
然后再让两个指针一起往后遍历,知道找到它们所指向的有相同数据域的节点。两指针都为空时还没找到,就代表没有相同节点。
具体函数代码如下:
SListNode *getPublicPoint(SListNode *headA, SListNode *headB)
{
int lenA = 0;
int lenB = 0;
int gap = 0;
int i = 0;
SListNode *cur;
SListNode *longerlist = headA;
SListNode *shortlist = headB;
//求两个链表的长度
for (cur = headA; cur; cur = cur->next)
{
lenA++;
}
for (cur = headB; cur; cur = cur->next)
{
lenB++;
}
gap = abs(lenA - lenB);//求多余部分长度
if (lenA < lenB)
{
longerlist = headB;
shortlist = headA;
}
for (; i < gap; i++)//右对齐
{
longerlist = longerlist->next;
}
for (; longerlist&&shortlist; longerlist = longerlist->next, shortlist = shortlist->next)
{
if (longerlist->data == shortlist->data)
{
return longerlist;
}
}
return NULL;
}
最后给出结构体SListNode
typedef struct SListNode
{
SLTDataType data;
struct SListNode *next;
}SListNode;