函数实现:
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;
}