日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

查找相交链表相交节点

發(fā)布時(shí)間:2024/1/8 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 查找相交链表相交节点 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

  • 查找鏈表相交節(jié)點(diǎn)
    • 情況1: 無(wú)環(huán)鏈表相交
    • 情況3:鏈表相交于入環(huán)前及入環(huán)節(jié)點(diǎn)
    • 情況4:鏈表A、B相交于入環(huán)后或不相交

查找鏈表相交節(jié)點(diǎn)

先判斷鏈表A和B是否有環(huán),并分別找到他們的環(huán)入口(loopA,loopB),具體方法可以參考我的上一篇博客判斷鏈表中是否有環(huán),并查找鏈表環(huán)入口。

可能有以下幾種情況:

1. (loopA == NULL && loopB == NULL);鏈表A、B均無(wú)環(huán);2. ((!loopA && loopB) || (loopA && !loopB));鏈表A、B中有一個(gè)有環(huán),有一個(gè)無(wú)環(huán),這種情況A、B必定不相交;3. (loopA == loopB && loopA);鏈表A、B相交于入環(huán)前或入環(huán)節(jié)點(diǎn)4. (loopA != loopB && loopA && loopB);鏈表A、B相交于入環(huán)后(不包括入環(huán)節(jié)點(diǎn)),或不相交

情況1: 無(wú)環(huán)鏈表相交


指針pA指向鏈表A頭節(jié)點(diǎn)(A1),pB指向鏈表B節(jié)點(diǎn)(B1),pA,pB均每次前進(jìn)一步。當(dāng)pA到達(dá)鏈表A尾部,令pA指向B1;同樣,pB到達(dá)鏈表B尾部,令pB指向A1。當(dāng)pA等于pB時(shí),即為A,B相交節(jié)點(diǎn)。

pA經(jīng)過(guò)的節(jié)點(diǎn)為: A1->A2->C1->C2->B1->B2->B3->C1pB經(jīng)過(guò)的節(jié)點(diǎn)為: B1->B2->B3->C1->C2->A1->A2->C1

將A,B鏈表中的節(jié)點(diǎn)分為3個(gè)部分:
1. 鏈表A獨(dú)立節(jié)點(diǎn);
2. 鏈表B的獨(dú)立節(jié)點(diǎn);
3. 鏈表A、B的共同部分;
由上可知,pA、pB指針在第二次到達(dá)鏈表A、B鏈表相交節(jié)點(diǎn)時(shí),必定分別遍歷一次鏈表中第1,2,3部分,所以此時(shí)pA、pB必定同時(shí)到達(dá)相交節(jié)點(diǎn)(即pA==pB)。

鏈表沒(méi)有相交時(shí),可以認(rèn)為相交于尾節(jié)點(diǎn)后一個(gè)節(jié)點(diǎn)(NULL)。

代碼如下:

// 返回鏈表相交節(jié)點(diǎn),若沒(méi)有相交返回NULL // 不考慮鏈表中存在環(huán)路的情況 ListNode *getIntersectionNodeNoLoop(ListNode *headA, ListNode *headB) {if(!headA || !headB) return NULL;ListNode *pa = headA;ListNode *pb = headB;while(pa != pb){pa = pa ? pa->next : headB;pb = pb ? pb->next : headA;}return pa; }

情況3:鏈表相交于入環(huán)前及入環(huán)節(jié)點(diǎn)


將入環(huán)節(jié)點(diǎn)當(dāng)做鏈表A、B的尾節(jié)點(diǎn),此時(shí),查找相交節(jié)點(diǎn)方式與無(wú)環(huán)鏈表相同。

// 返回鏈表相交節(jié)點(diǎn),若沒(méi)有相交返回NULL // 相交節(jié)點(diǎn)位于入環(huán)前 // loop 為鏈表中環(huán)的入口節(jié)點(diǎn),因?yàn)橄嘟挥谌氕h(huán)前,所以兩個(gè)鏈表入口節(jié)點(diǎn)相同 ListNode *getIntersectionNodeBeforeNode(ListNode *headA, ListNode *headB, ListNode *loop) {if(!headA || !headB) return NULL;ListNode *pa = headA;ListNode *pb = headB;while(pa != pb){pa = pa != loop ? pa->next : headB;pb = pb != loop ? pb->next : headA;}return pa; }

情況4:鏈表A、B相交于入環(huán)后或不相交


首先判斷鏈表是否相交,指針cur從鏈表A的入口節(jié)點(diǎn)loopA開(kāi)始每次前進(jìn)一步,若找到與鏈表B入口節(jié)點(diǎn)loopB相同節(jié)點(diǎn),則鏈表A、B相交;若cur再次到達(dá)loopA,依然沒(méi)有與loopB相同節(jié)點(diǎn),則不相交。

bool IsIntersection(ListNode *loopA, ListNode *loopB){ListNode *cur = loopA;while(cur != loopB){cur == cur->next;if(cur == loopA) return false;}return true; }

在這種情況下,若A、B相交,loopA和loopB均為相交節(jié)點(diǎn)。

ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {// 獲取鏈表入環(huán)節(jié)點(diǎn),見(jiàn)[判斷鏈表中是否有環(huán),并查找鏈表環(huán)入口](https://blog.csdn.net/hander_left/article/details/107718329)ListNode *loopA = detectCycle(headA);ListNode *loopB = detectCycle(headB);if(loopA == NULL && loopB == NULL) { // 情況1:無(wú)環(huán)鏈表return getIntersectionNodeNoLoop(headA, headB);}if(loopA == NULL || loopB == NULL){ // 情況2:不相交return NULL;}if(loopA == loopB) { // 情況3: 相交于入環(huán)前或入環(huán)節(jié)點(diǎn)return getIntersectionNodeBeforeNode(headA, headB, loopA);} // 情況4if(IsIntersection(loopA, loopB){return loopA; // return loopB;}return NULL; }

總結(jié)

以上是生活随笔為你收集整理的查找相交链表相交节点的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。