您的位置:首页 > 其它

链表中的带环相交问题

2016-09-19 23:18 316 查看
与之相关的其他函数

http://blog.csdn.net/snow_5288/article/details/52564615
http://blog.csdn.net/snow_5288/article/details/52550765
http://blog.csdn.net/snow_5288/article/details/52524830





函数实现:

PNode CheckCircle(PNode pHead)//判断链表是否带环
{
PNode pFast = NULL;
PNode pSlow = NULL;
if (NULL == pHead)
{
return NULL;
}
pFast = pHead;
pSlow = pHead;
while(pFast && pFast->next)
{
pFast = pFast->next->next;
pSlow = pSlow->next;
if(pFast == pSlow)
break;
}
if(pFast == pSlow && pFast != pHead)
return pFast;
else
return NULL;
}
int GetCircleLength(PNode pMeetNode)//如果带环,求环的长度
{
int len = 1;
PNode CurNode = pMeetNode;
if(NULL == pMeetNode)
return 0;
while(CurNode->next != pMeetNode)
{
CurNode = CurNode->next;
len++;
}
return len;
}
PNode GetInterNode(PNode pHead,PNode pMeetNode)//获取环的入口点
{
PNode pH = pHead;
PNode pM = pMeetNode;
if(NULL == pHead || NULL == pMeetNode)
return NULL;
while(pH != pM)
{
pH = pH->next;
pM = pM->next;
}
return pM;
}
int CheckCrossWithCircle(PNode pHead1,PNode pHead2)//判断链表是否相交(有可能带环)
{
PNode pMeetNode1 = NULL;
PNode pMeetNode2 = NULL;
if(NULL == pHead1 || NULL == pHead2)
return 0;
pMeetNode1 = CheckCircle(pHead1);
pMeetNode2 = CheckCircle(pHead2);
if(NULL == pMeetNode1 && NULL == pMeetNode2)//两个链表都不带环
{
PNode p1 = pHead1;
PNode p2 = pHead2;
while(p1->next)
{
p1 = p1->next;
}
while(p2->next)
{
p2 = p2->next;
}
if(p1 == p2)
return 1;
else
return 0;
}
else if((NULL == pMeetNode1 && pMeetNode2) ||
(NULL == pMeetNode2 && pMeetNode1))//一个带环一个不带环
return 0;
else//两个都带环
{
PNode pM1 = pMeetNode1;
PNode pM2 = pMeetNode2;
while(pM1 != pM1->next)
{
pM1 = pM1->next;
if(pM1 == pM2)
break;
}
if (pM1 == pM2)
return 2;
else
return 0;
}
}
PNode UnionSet(Node *list1,Node *list2)//求两个已排序单链表中相同的数据----打印出来
{
PNode p1 = list1;
PNode p2 = list2;
PNode p3 = NULL;
PNode newHead = p3;
if(NULL == list1 || NULL == list2)
return NULL;
while(!p3)
{
if(p1->data == p2->data)
{
p3 = p1;
newHead = p3;
while(p1->data == p1->next->data)
{
p1 = p1->next;
}
p1 = p1->next;
while(p2->data == p2->next->data)
{
p2 = p2->next;
}
p2 = p2->next;
}
else if(p1->data < p2->data)
p1 = p1->next;
else
p2 = p2->next;
}

while(p1 && p2)//假设均是升序
{
if(p1->data == p2->data)
{
p3->next = p1;
p3 = p3->next;
if(!p1->next || !p2->next)
break;
while(p1->data == p1->next->data)
{
p1 = p1->next;
}
p1 = p1->next;
while(p2->data == p2->next->data)
{
p2 = p2->next;
}
p2 = p2->next;
}
else if(p1->data < p2->data)
p1 = p1->next;
else
p2 = p2->next;
}
p3->next = NULL;
return newHead;
}
测试代码:

//void test6()
//{
//	PNode pNode1 = NULL;
//	PNode pNode2 = NULL;
//	PNode pRet = NULL;
//	PNode tmp1 = NULL;
//	PNode tmp2 = NULL;
//	int ret = 0;
//	Init_LinkList(&pNode1);
//	Init_LinkList(&pNode2);
//	PushBack(&pNode1,1);
//	PushBack(&pNode1,2);
//	PushBack(&pNode1,3);
//	PushBack(&pNode1,4);
//	PushBack(&pNode2,5);
//	tmp1 = Find(pNode1,3);
//	tmp2 = EndNode(&pNode2);
//	tmp2->next = tmp1;
//	ret = CheckCross(pNode1,pNode2);
//	if(ret == 1)
//		printf("两个链表有交点\n");
//	else
//		printf("两个链表无交点\n");
//	pRet = Cross(pNode1,pNode2);
//	Print_LinkList(pRet);
//	Destroy(&pRet);
//}
//void test7()
//{
//	PNode pNode = NULL;
//	PNode pMeetNode = NULL;
//	PNode tmp1 = NULL;
//	PNode tmp2 = NULL;
//	PNode pInterNode = NULL;
//	int length = 0;
//	Init_LinkList(&pNode);
//	PushBack(&pNode,1);
//	PushBack(&pNode,2);
//	PushBack(&pNode,3);
//	PushBack(&pNode,4);
//	PushBack(&pNode,5);
//	tmp1 = Find(pNode,3);
//	tmp2 = EndNode(&pNode);
//	tmp2->next = tmp1;
//	pMeetNode = CheckCircle(pNode);
//	if(pMeetNode == NULL)
//		printf("链表不带环\n");
//	else
//		printf("链表带环,且相遇节点为%d\n",pMeetNode->data);
//	length = GetCircleLength(pMeetNode);
//	printf("环的长度为%d\n",length);
//	pInterNode = GetInterNode(pNode,pMeetNode);
//	if(pInterNode == NULL)
//		printf("链表不带环\n");
//	else
//		printf("链表带环,且相遇节点为%d\n",pInterNode->data);
//	free(pNode);//注意带环的链表不能再用自拟的Destroy函数销毁
//}
//void test8()
//{
//	PNode pNode1 = NULL;
//	PNode pNode2 = NULL;
//	PNode pRet = NULL;
//	PNode tmp1 = NULL;
//	PNode tmp2 = NULL;
//	int ret = 0;
//	Init_LinkList(&pNode1);
//	Init_LinkList(&pNode2);
//
//	////两个链表都没环
//	//PushBack(&pNode1,1);
//	//PushBack(&pNode1,2);
//	//PushBack(&pNode1,3);
//	//PushBack(&pNode1,4);
//	//PushBack(&pNode2,5);
//	//tmp1 = Find(pNode1,3);
//	//tmp2 = EndNode(&pNode2);
//	//tmp2->next = tmp1;
//
//	////一个有环一个没环
//	//PushBack(&pNode1,1);
//	//PushBack(&pNode1,2);
//	//PushBack(&pNode1,3);
//	//PushBack(&pNode1,4);
//	//PushBack(&pNode2,3);
//	//tmp1 = Find(pNode1,3);
//	//tmp2 = EndNode(&pNode1);
//	//tmp2->next = tmp1;
//	//ret = CheckCrossWithCircle(pNode1,pNode2);
//	//if(ret == 1)
//	//	printf("两个链表有交点\n");
//	//else
//	//	printf("两个链表无交点\n");
//
//	//两个都有环
//	PushBack(&pNode1,1);
//	PushBack(&pNode1,2);
//	PushBack(&pNode1,3);
//	PushBack(&pNode1,4);
//	PushBack(&pNode2,5);
//	PushBack(&pNode2,3);
//	PushBack(&pNode2,4);
//	//给pNode1构造环
//	tmp1 = Find(pNode1,3);
//	tmp2 = EndNode(&pNode1);
//	tmp2->next = tmp1;
//	//给pNode2构造环
//	tmp1 = Find(pNode2,3);
//	tmp2 = EndNode(&pNode2);
//	tmp2->next = tmp1;
//	//使其相交
//	tmp1 = Find(pNode1,2);
//	tmp2 = Find(pNode2,3);
//	tmp1->next = tmp2;
//	ret = CheckCrossWithCircle(pNode1,pNode2);
//	if(ret == 1)
//		printf("两个链表都不带环且有交点\n");
//	else if(ret == 2)
//		printf("两个链表都带环且有交点\n");
//	else
//		printf("两个链表无交点\n");
//	free(pNode2);
//	free(pNode1);
//}
void test9()
{
PNode pNode1 = NULL;
PNode pNode2 = NULL;
PNode pRet = NULL;
Init_LinkList(&pNode1);
Init_LinkList(&pNode2);
PushBack(&pNode1,1);
PushBack(&pNode1,2);
PushBack(&pNode1,2);
PushBack(&pNode1,4);
PushBack(&pNode1,4);
PushBack(&pNode1,5);

PushBack(&pNode2,2);
PushBack(&pNode2,4);
PushBack(&pNode2,5);
PushBack(&pNode2,6);
pRet = UnionSet(pNode1,pNode2);
Print_LinkList(pRet);
Destroy(&pNode1);
Destroy(&pNode2);
}
int main()
{
//test1();
//test2();
//test3();
//test4();
//test5();
//test6();
//test7();
//test8();
test9();
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: