求链表相交时的交点(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 –