查找相交链表相交节点
目錄
- 查找鏈表相交節(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)。
將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)鏈表相同。
情況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),則不相交。
在這種情況下,若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)題。
- 上一篇: React回调函数两种常用方式
- 下一篇: hive ddl语法使用详解