求链表相交时的交点(C语言)
生活随笔
收集整理的这篇文章主要介绍了
求链表相交时的交点(C语言)
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
//链表相交时的交点
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;}
}
总结
以上是生活随笔为你收集整理的求链表相交时的交点(C语言)的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 如何下载多段ts视频 m3u8 ffmp
- 下一篇: JAVA如何隐藏异常堆栈_java –