逆轉交替合併兩個鍊錶

2021-07-03 23:04:54 字數 2090 閱讀 2828

一、問題描述

鍊錶a和b

a: 1->2->3->4

b: a->b->c->d

請逆轉交替合併兩個鍊錶,示例結果如下:

4->d->3->c->2->b->1->a

節點型別定義如下:

classnode

//a、b都大於等於2個節點

node nexta;

node nextb;

nextb = b.next;

b.next = null;

nexta = a.next;

a.next = b;

b = nextb;

while (nexta.next != null)

nextb.next = a;

nexta.next = b;

return nexta;

}三、解析:

程式分成三個部分——while迴圈之前、while迴圈體、while迴圈之後。

1)處理之前的鍊錶a和b

2)while迴圈——核心的處理部分

但是1中需要特別處理a所在的節點,僅對於a所在的節點需要乙個next=null的操作,也就是說1中的第乙個原子要放在迴圈之外實現,這包括1指向a,b指向1的操作。

換種方式,如果使用2方式,就只需要將1指向a放在迴圈之外。所以,這裡採用了2中描述的原子結構。

原子結構需要的資訊

當我們進行到某一次迴圈時,假設進行到藍色圓圈的操作了,這時候我們鍊錶的狀態為:

更為直觀的畫法為:

它涉及到3個節點——2,3和c。其中紅色部分是我們希望做到的鏈結方式。為了鏈結c->2,3->c,必須知道有相應的指標記錄他們的位置。所以在迴圈之前我們需要掌握這三個元素的位址,並且在處理完之後,用相同的方式表示下一次需要處理的原子結構。

a、na、b代表指向相應節點的指標或者說是引用。

這些賦值操作正是迴圈體的中**所做的事情,恰好**也是按照上面指定的命名形式,有一點區別,圖中的na代表**中的nexta。除此之外,**中定義了nextb作為乙個中間變數,用來記錄c->d斷開之前d節點的位址,因為c指向2之後就會失去對d的聯絡,這個中間變數是必須的。

3)while迴圈之前——解決預備操作所帶來的問題

我們還沒有處理a節點,因為它太特殊了,沒有合適的原子結構能包括它。所以我們把它放在迴圈體之外,並且為迴圈做好準備工作,我們希望的結果是這樣:

在這之後我們就可以把1,2,b放在迴圈體中處理。這裡也考慮了a、b都只有乙個節點的情況,也需要單獨處理。

4)while迴圈之後——最後的處理

當我們發現b鍊錶到達末尾時,結束迴圈。但這時候並有處理末尾節點,換句話說,末尾節點不在原子結構中。我們的迴圈會停止在這個原子結構中:

作為最後的操作,我們需要手動處理d->3,4->d的鏈結步驟——這也是沒有辦法的,因為原子結構的處理必須找到能夠把所有指標傳遞下去的節點,作為最後的節點是沒辦法吧指標繼續傳遞下去。

這不是乙個完整的方法,還有很多事情沒有處理,比如輸入的a、b如果不等長,應該如何處理。另外node資料結構並沒有完整的定義,不過這都不是本文討論的重點。

合併兩個鍊錶

就是簡單的合併兩個鍊錶,這裡要求倆個鍊錶是有序的。比如 1 2 3 4 5 和 0 7 13 合併之後為 0 1 2 3 4 5 7 13 首先,簡單介紹一下思路,首先區遍歷倆個鍊錶,如果第乙個鍊錶的值小於等於第二個鍊錶的值,那麼將第乙個鍊錶的值插入乙個新的頭節點 鍊錶中,反之如果大於第二個鍊錶的值...

合併兩個鍊錶

1.問題描述description 將兩個公升序鍊錶合併為乙個新的公升序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。示例 輸入 1 2 4,1 3 4 輸出 1 1 2 3 4 42.思路 將頭部較小的鍊錶的節點與另乙個鍊錶合併,遞迴解答。退出條件為 當乙個鍊錶為空時,返回另乙個鍊錶...

鍊錶 合併兩個有序鍊錶

標籤 鍊錶 題目描述 輸入兩個單調遞增的鍊錶,輸出兩個鍊錶合成後的鍊錶,當然我們需要合成後的鍊錶滿足單調不減規則。解題思路 兩種解法 遞迴和非遞迴 拓展 參考 public listnode merge listnode list1,listnode list2 else 非遞迴 public li...