題目連結:
題目意譯:
你被給定一個 k 個連結串列(Linked List)組成之陣列 lists,每個連結串列已按照升序排序。
合併所有的連結串列成一個已排序連結串列並回傳它。
限制:
k == lists.length
0 ≦ k ≦ 10 ^ 4
0 ≦ lists[i].length ≦ 500
-10 ^ 4 ≦ lists[i][j] ≦ 10 ^ 4
lists[i] 按升序排列。
lists[i].length 之總和不超過 10 ^ 4。
範例測資:
範例 1:
輸入: lists = [[1,4,5],[1,3,4],[2,6]]
輸出: [1,1,2,3,4,4,5,6]
解釋: 連結串列們為:
[
1->4->5,
1->3->4,
2->6
]
將它們合併成一個連結串列:
1->1->2->3->4->4->5->6
範例 2:
輸入: lists = []
輸出: []
範例 3:
輸入: lists = [[]]
輸出: []
解題思維:
我們可以先掃過列表中的 k 個連結串列,然後利用一個優先佇列 P(Priority Queue)來儲存這 k 個串列第一個節點(如果有的話。沒有頭的串列可以直接跳過),然後根據這些節點之值中最小的作為 P 的頂端元素。
因此接著我們重複以下步驟直到 P 為空:
將 P 的頂端元素取出並移出佇列。將該元素放在當前「已排序」之串列的尾端(此為用來儲存所求的已排序串列)。然後看該節點有無「下一個」,代表著它在原串列不是原本的「結尾元素」,因此我們將其「下一個元素」放入 P 之中;如果沒有就忽略。
這樣一來我們便可以一一地從各個串列中取出最小的值來放到當前串列的尾端,如此便可以得到一個已排序的單一串列,即所求。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。