您的位置:首页 > 其它

链表相交

2016-06-25 01:42 281 查看
判断两个链表是否相交???

我们先来分析一下两个链表的相交问题,如图:

两条链表都不带环:





一条链表带环,一条不带环:





两条链表都带环:



//如果两个链表都不带环
int NotCycleCheckCross(pLinkNode head1,pLinkNode head2)
{
pLinkNode list1 = head1->next;
pLinkNode list2 = head2->next;
if ((NULL==list1 )||(NULL==list2))
{
return 0;      //不相交
}
while (NULL != list1->next)
{
list1 = list1->next;
}
while (NULL != list2->next)
{
list2 = list2->next;
}
if (list1==list2)
{
return 1;      //相交
}
return 0;          //不相交
}

//链表带环,判断两个链表是否相交
int CycleCheckCross(pLinkNode meet1, pLinkNode meet2)
{
pLinkNode cur = meet1->next;
if (meet1 == meet2)
{
return 1;     //链表相交
}
while ((cur != meet1)&&(cur!=meet2))
{
cur = cur->next;
}
if (cur == meet2)
{
return 1;   //链表相交
}
return 0;       //不相交
}

//将上面两个函数封装成一个函数
int CheckCross(pLinkNode head1, pLinkNode head2)          //参数为两个头结点
{
pLinkNode fast = NULL;
pLinkNode slow = NULL;
pLinkNode meet1 = NULL;
pLinkNode meet2 = NULL;
if (head1->next == NULL || head2->next == NULL)
{
return 0;          //至少一个链表为空链表,则两个链表一定不相交
}
fast = head1->next;
slow = head1->next;
while (fast&&fast->next)           //判断链表head1是否带环
{
fast = fast->next->next;
slow = slow->next;
if (fast == slow)
{
meet1 = fast;
break;
}
}
fast = head2->next;
slow = head2->next;
while (fast&&fast->next)           //判断链表head2是否带环
{
fast = fast->next->next;
slow = slow->next;
if (fast == slow)
{
meet2 = fast;
break;
}
}
if ((meet1 == NULL) && (meet2 == NULL))       //如果两个链表都不带环
{
return NotCycleCheckCross(head1, head2);
}
else if (meet1&&meet2)                        //如果两个链表都带环
{
return CycleCheckCross(meet1, meet2);
}
//如果两个链表一个带环一个不带环,则一定不相交直接返回0
return 0;            //不相交
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: