您的位置:首页 > 其它

判断两个链表是否相交,若相交,求交点。(假设链表可能带环)

2018-01-24 21:49 330 查看


SListNode* SListGetCrossNodeCycle(SListNode* list1,SListNode* list2)//判断两个链表是否相交,若相交,求交点(链表可能带环)
{
SListNode *M1 = SListIsCycle(list1);//若带环,返回相遇点
SListNode *M2 = SListIsCycle(list2);
SListNode *entryNode1 = SListEntryNode(list1,M1);//返回入口点
SListNode *entryNode2 = SListEntryNode(list2,M2);

SListNode *entryNext1 = entryNode1->_next;//保存入口点的next,为恢复环做准备
SListNode *entryNext2 = entryNode2->_next;
SListNode *meet = NULL;
SListNode *cur1 = M1->_next;
if(M1 == NULL && M2 == NULL)//两个都不带环,转换成Y型交点问题
{
return SListGetCrossNode(list1,list2);
}
else if(M1 && M2)//两个都带环问题,三种情况分别讨论
{

while(cur1 != M2 && cur1 != M1)//第一种情况,两个不相交问题
{
cur1 = cur1->_next;
}
if(cur1 == M1)
{
return NULL;
}
else//区分第二种,和第三种情况
{
if(entryNode1 == entryNode2)
{
entryNode1->_next = NULL;
entryNode2->_next = NULL;
meet = SListGetCrossNode(list1,list2);
return meet;
entryNode1->_next = entryNext1;//恢复带环
entryNode2->_next = entryNext2;
}
else
{
return entryNode2;

}

}

}
else//一个带环,一个不带环
{
return NULL;

}

}


以上调用的子函数请查看单链表经典面试题(2)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐