合併兩個有序的鍊錶

2021-07-11 17:25:49 字數 1349 閱讀 2150

題目:輸入兩個遞增排序的鍊錶,合併這兩個鍊錶並使新鍊錶中的結點仍然是按照遞增排序的。例如輸入兩個鍊錶分別1,3,5和2,4,6,合併後的鍊錶則是1,2,3,4,5,6.

鍊錶結點定義如下:

typedef struct listnode

node, *pnode;

拿到這個題目我們就來分析一下:首先分析合併兩個鍊錶的過程,我們從頭結點開始。假設有兩個這樣的鍊錶:

鍊錶1的頭結點小於鍊錶2的頭結點,因此鍊錶1的頭結點將作為合併後的新的頭結點,就像下面這樣:

然後我們繼續合併兩個鍊錶中剩餘的結點,也就是方框中的結點了。剩下的結點分別還是排序的,所以合併這兩個鍊錶的步驟和前面是一樣的。依舊是比較兩個頭結點的值,因為鍊錶2的頭結點的值小於鍊錶1的頭結點的值,所以鍊錶2的頭結點將成為剩餘鍊錶合併後的新的頭結點,我們把它連線在之前確定出來的頭結點的後面,如圖所示:

當我們每次得到新的頭結點,並連線到新鍊錶的尾部後,剩餘的鍊錶依舊是有序的,所以合併的步驟與之前的一樣。這是乙個典型的遞迴過程。所以我決定先用遞迴來實現它。

不過在此之前有一點需要注意的是,當傳入的第乙個鍊錶為空。,即頭結點指標為null,我們要把它與鍊錶2合併,顯然合併後的結果當然就是鍊錶2了;同理,鍊錶2為空時,合併後的鍊錶為鍊錶1;若兩個鍊錶都是空鍊錶,則合併後依舊是乙個空鍊錶。既然已經想理清楚了具體的思路和健壯性的考慮,我們可以開始寫**了:

pnode merge_two_list_recur(pnode head1, pnode head2)

else

return new_head;

}

最後我們還可以用非遞迴的方式實現這個演算法:

pnode merge_two_list(pnode head1, pnode head2)

else

if (flag)

else //只進來一次

}if (null != head1)

else if (null != head2)

return new_head;

}

依舊不難,這裡就不在贅述了。

合併兩個有序鍊錶

鍊錶的題目總是讓我很惆悵。動輒就會runtime error。比如這題,額外用了乙個節點的空間來儲存頭節點。我很不情願多用這個空間,不過貌似不行。貌似不行,實際可行,見附錄。把頭節點提出迴圈 實現類 class solution else if l1 null p next l1 if l2 nul...

合併兩個有序鍊錶

三個指標乙個儲存la鍊錶 乙個儲存lb鍊錶,乙個指向新的鍊錶。鍊錶的插入,兩個指標,乙個是head,乙個指向head後面的鏈,新插入的元素位於head後面。執行該 自己外加上class類。static class node public static void main string args st...

合併兩個有序鍊錶

將兩個有序鍊錶合併為乙個新的有序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。示例 輸入 1 2 4,1 3 4 輸出 1 1 2 3 4 4思路 很簡單就是二路歸併的思想,時間複雜度o n definition for singly linked list.struct listno...