判断两个链表是否相交,若相交,求交点。(假设链表不带环)
假设这就是两条相交的链表,交点为5,现给出两条链表的头结点plist1和plist2,求出交点:
首先判断两条链表是否相交
两条相交的链表只能是 V 字形状或者 Y 字形,所以遍历最后肯定是同一个节点,由此便可以得出两条链表是否相交,还是要注意特殊情况下的判断,保证代码的鲁棒性!
//判断两个链表是否相交,若相交,求交点。(假设链表不带环)
int CheckCross(pList list1, pList list2)
{
pNode end1 = NULL;
pNode end2 = NULL;
//任意一个为空指针就不可能相交
if (list1 == NULL || list2 == NULL)
return 0;
end1 = list1;
end2 = list2;
while (end1->next != NULL)
end1 = end1->next;
while (end2->next != NULL)
end2 = end2->next;
return end1 == end2;
}
返回两条相交链表的交点
这个也不难,思路就是看两条链表谁更长,让较长的先走(长链表的长度-短链表的长度的绝对值)步,这样再同时开始走,直到地址相同的时候肯定就是交点!
//相交的话返回交点
pNode GetGrossNode(pList list1, pList list2)
{
int len1 = 0;
int len2 = 0;
//长度之差
int gap = 0;
pNode p1 = list1;
pNode p2 = list2;
//先求出两条链表的长度
while (p1 != NULL)
{
len1++;
p1 = p1->next;
}
while (p2 != NULL)
{
len2++;
p2 = p2->next;
}
gap = abs(len1 - len2);
//让较长的链表先走gap步
if (len1 > len2){
while (gap--)
list1 = list1->next;
}
else
{
while (gap--)
list2 = list2->next;
}
//两个链表同时开走,只要遇到地址一样的节点那么就是相交的点
while (list1 != NULL)
{
list1 = list1->next;
list2 = list2->next;
if (list1 == list2)
return list1;
}
return NULL;
}