您的位置:首页 > 编程语言 > C语言/C++

求链表相交时的交点(C语言)

2016-04-14 20:06 537 查看
//链表相交时的交点
PSListNode IntersectionNode(PSListNode pL1, PSListNode pL2)
{
int count1 = 0;
int count2 = 0;
PSListNode PSList1 = pL1;
PSListNode PSList2 = pL2;
PSListNode pMeetNode1 = HasCycle(pL1);
PSListNode pMeetNode2 = HasCycle(pL2);
if ((NULL == pL1) || (NULL == pL2))
{
return NULL;
}
else
{
//先求每个链表的长度
//两个链表都没环
if ((NULL == pMeetNode1) && (NULL == pMeetNode2))
{
while (NULL != PSList1)
{
PSList1 = PSList1->pNextNode;
count1++;
}
while (NULL != PSList2)
{
PSList2 = PSList2->pNextNode;
count2++;
}
}
//两个链表都有环
else if ((NULL != pMeetNode1) && (NULL != pMeetNode2))
{
PSListNode pInNode1 = FindEnterNode(PSList1, pMeetNode1);
PSListNode pInNode2 = FindEnterNode(PSList2, pMeetNode2);
//先计算头指针到环入口结点的长度,再计算环的长度
while (PSList1 != pInNode1)
{
PSList1 = PSList1->pNextNode;
count1++;
}
while (PSList1->pNextNode != PSList1)
{
PSList1 = PSList1->pNextNode;
count1++;
}
count1++;;
while (PSList2 != pInNode2)
{
PSList2 = PSList2->pNextNode;
count2++;
}
while (PSList2->pNextNode != PSList1)
{
PSList2 = PSList2->pNextNode;
count2++;
}
count2++;;
}
//一个有环,一个没环,不会相交
else
{
return NULL;
}
//让长度长的链表的头指针先走它长于另一个链表的结点数
//在计算链表长度时修改了这两个指针的值,在这儿需要把它们改回来
PSList1 = pL1;
PSList2 = pL2;
if (count1 > count2)
{
int temp = count1 - count2;
while (0 == temp--)
{
PSList1 = PSList1->pNextNode;
}
}
else
{
int temp = count2 - count1;
while (0 == temp--)
{
PSList2 = PSList2->pNextNode;
}
}
//此时,让两个链表的头指针同时移动,直到它们相等就找到了交点
//因为题目是找交点,那么交点就存在,所以这儿不用怕死循环
while (1)
{
if (PSList1 = PSList2)
{
break;
}
PSList1 = PSList1->pNextNode;
PSList2 = PSList2->pNextNode;
}
return PSList1;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: