《演算法基礎》 3 4 有序鍊錶

2021-09-23 14:40:10 字數 665 閱讀 9523

有時,讓鍊錶中的項保持有序是十分方便的。當將乙個新項加入有序鍊錶時,需要搜尋鍊錶來找到該項所屬位置,並更新相應的鏈結來插入該項。

下面的偽**顯示了在乙個有序鍊錶中插入乙個項的演算法:

在最壞的情況下,該演算法可能需要遍歷整個鍊錶為新項找到正確的位置。因此,如果該鍊錶儲存n個單元格,其執行時間為o(n)。雖然不能提高理論執行時間,但是可以通過新增底端哨兵使演算法更簡單而且在實際執行中更加快速。如果將底部哨兵的value設定成乙個比單元格中任意可能儲存的value值都大的值,就可以刪除對top.next!=null的測試。可以這樣做是因為這個**最終會為新的單元格找到乙個合適的位置,即使該位置就在底部哨兵之前。

例如,如果單元格中的value為使用ascii字元表示的名字,可以設定底部哨兵的value為「~」因為「~」字元在所有可用的字元中排名最後。如果單元格的value為整數,就可以以最大可能的整數值來設定底部哨兵的value。 (在大多數的32位系統中,該值為2 147 483 647。)

下面的偽**顯示了修改後的演算法,並假設鍊錶具有乙個擁有最大值的底部哨兵:

演算法 合併k個有序鍊錶

合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。示例 輸入 1 4 5,1 3 4,2 6 輸出 1 1 2 3 4 4 5 6這裡提供兩個思路,一是不斷通過兩兩合併的方式把全部鍊錶合併起來 二是每次從所有鍊錶中選出最小的那個加到鍊錶尾部。思路一 這個思路很清晰,但是要注意一...

鍊錶 合併有序鍊錶

題目 將兩個公升序鍊錶合併為乙個新的 公升序 鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。示例 輸入 1 2 4,1 3 4 輸出 1 1 2 3 4 4 題解我們這裡利用到了乙個前哨節點,因為兩個鍊錶實際上是已經排好序了,所以我們只需要比較兩個節點誰大誰小,找到小的接上去,然後那個...

鍊錶 合併有序鍊錶

將兩個公升序鍊錶合併為乙個新的 公升序 鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。leetcode21 class solution else head head.next head.next l1 null?l2 l1 return result.next class solut...