题目要求
判断两个单链表是否相交,如果相交则返回第一个相交的节点,如果没有相交则返回NULL
算法
1、先求两个链表长度的差值,让长的链表指针先走这个差值,如下图让plist1先走到p位置
2、完成步骤1后,让两个链表的指针同步向后走,每走一步判断两个节点是否相等,如果相等则直接返回这个节点,如果走到NULL,则两个链表不相交
C代码
LinkList IsIntersect(LinkList plist1, Linklist plist2)
{
if (plist1 == NULL || plist2 == NULL)
{
return NULL;
}
if (ListEmpty(plist1) || ListEmpty(plist2))//空链表
{
return NULL;
}
int len1 = GetLength(plist1);
int len2 = GetLength(plist2);
LinkList p = plist1, q = plist2;
if (len1 > len2)// 长链表走差值
{
for (int i = 0; i < len1 - len2; i++)
{
p = p->next;
}
}
else
{
for (int i = 0; i < len2 - len1; i++)
{
q = q->next;
}
}
while (p != NULL)//两个指针同步走
{
p = p->next;
q = q->next;
if (p == q)
{
return p;
}
}
return NULL;
}