int IsListCrossWithCircle(pList plist1, pList plist2)
{
pNode pMeetNode1 = NULL, pMeetNode2 = NULL;
//杜绝空链表的存在
if (NULL == plist1 && NULL == plist2)
{
return 0;
}
//先各自判断两个链表是否带环(带环返回相遇点,否则返回空)
pMeetNode1 = IsCircle(plist1);
pMeetNode2 = IsCircle(plist2);
//两个链表都不带环
if (NULL == pMeetNode1 && NULL == pMeetNode2)
{
//找两个链表的最后一个结点,然后检测是否是同一个结点
pNode pTail1 = plist1;
pNode pTail2 = plist2;
if (pTail1 == NULL || pTail2 == NULL)
{
return 0;
}
while (pTail1)
{
pTail1 = pTail1->next;
}
while (pTail2)
{
pTail2 = pTail2->next;
}
if (pTail1 == pTail2)
{
return 1;
}
}
//两个链表均带环
else if (pMeetNode1 && pMeetNode2)
{
pNode pCur = pMeetNode1;
do
{
if (pCur == pMeetNode2)
{
return 2;
}
pCur = pCur->next;
}while (pCur->next != pMeetNode1);//绕环一周
}
return 0;
}
判断两个链表是否相交,若相交,求交点。(链表可能带环)
猜你喜欢
转载自blog.csdn.net/weixin_40995778/article/details/82989687
今日推荐
周排行