对于链表相交要分几种情况
1、两无环单链表相交
2、一无环与一有环链表不可能相交
3、两有环链表相交
pLinkNode Noloop_Point(pLinkList plist1, pLinkList plist2)
{ //两无环链表相交
pLinkNode p1 = Check_Loop(plist1);
pLinkNode p2 = Check_Loop(plist2);
int l1 = Len(plist1);
int l2 = Len(plist2);
int l = l1 - l2;
pLinkNode cur1 = plist1->_pHead;
pLinkNode cur2 = plist2->_pHead;
//两无环链表相交
if (l > 0)//链表1较长
{
while (l > 0)
{
cur1 = cur1->next;
l--;
}
while (cur1 != cur2)
{
cur1 = cur1->next;
cur2 = cur2->next;
}
return cur1;
}
else
{
while (l < 0)
{
cur2 = cur2->next;
l++;
}
while (cur1 != cur2)
{
cur1 = cur1->next;
cur2 = cur2->next;
}
return cur1;
}
}
pLinkNode loop_Point(pLinkList plist1, pLinkList plist2)//有环
{
pLinkNode cur1 = plist1->_pHead;
pLinkNode cur2 = plist2->_pHead;
//有环链表相交(交点环外 )
pLinkNode p1 = Loop_en(plist1);//环入口
pLinkNode p2 = Loop_en(plist2);
if (p1 == p2)//交点在环外,让环入口指向任一链表的第一个节点,构成环,该环的入口为交点
{
p1->next = plist2->_pHead;
return Loop_en(plist1);
}
else
return p1;//return p2;
}
以下代码为判断链表是否带环
int NoLoop_Cross(pLinkList plist1, pLinkList plist2)
//无环链表相交则最后一节点相同
{
pLinkNode cur1 = plist1->_pHead;
pLinkNode cur2 = plist2->_pHead;
while (cur1->next != NULL)
{
cur1 = cur1->next;
}
while (cur2->next != NULL)
{
cur2 = cur2->next;
}
if (cur1 == cur2)
return 1; //相交
else
return 0;
}
int Loop_Cross(pLinkList plist1, pLinkList plist2)
//有环链表相交则环内会有相同的节点
{
pLinkNode tmp1=Check_Loop(plist1);
pLinkNode tmp2 = Check_Loop(plist1);
int len = Loop_Len(plist1);
while (len--)
{
if (tmp1 == tmp2)
return 1;//相交
tmp1 = tmp1->next;
}
return 0;
}
int Link_Cross(pLinkList plist1, pLinkList plist2)//合并以上两个函数
{
if (plist1 == NULL || plist2 == NULL)
{
return 0;
}
pLinkNode tmp1=Check_Loop(plist1);//判断是否带环,有环返回快慢指针相遇点
pLinkNode tmp2 = Check_Loop(plist2);
if (tmp1&&tmp2)
{
return Loop_Cross(plist1, plist2);
}
else if (tmp1 == NULL&&tmp2 == NULL)
{
return NoLoop_Cross(plist1, plist2);
}
else
return 0;
}