合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。
示例:輸入:
[1->4->5,
1->3->4,
2->6
]輸出: 1->1->2->3->4->4->5->6
這個思路是我最先想到的思路,通過對鍊錶兩兩進行合併,得到排序好的鍊錶。時間複雜度是o(n
logk
)o(nlogk)
o(nlog
k),**也比較簡單,下面附上sweetiee?的**。
class
solution
return
merge
(lists,
0, lists.length -1)
;}private listnode merge
(listnode[
] lists,
int lo,
int hi)
int mid = lo +
(hi - lo)/2
; listnode l1 =
merge
(lists, lo, mid)
; listnode l2 =
merge
(lists, mid +
1, hi)
;return
merge2lists
(l1, l2);}
}
這個是遞迴的合併**,還有迭代的可以自行實現。
直接上**,一看就懂。
public listnode mergeklists2
(listnode[
] lists)
// 建立優先佇列,設定比較器為佇列節點值從小到大排列。
queue
queue =
newpriorityqueue
<
>
((v1, v2)
-> v1.val - v2.val)
;// 將陣列中有序鍊錶的頭節點依次加入到優先佇列中。
for(listnode node : lists)
}// 定義乙個頭節點用於指向合併後有序鍊錶的頭節點。
listnode head =
newlistnode(0
);// 定義乙個指標節點用來輔助拼接有序鍊錶。
listnode p = head;
while
(!queue.
isempty()
)}return head.next;
}
每日一題 LeetCode
在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。示例 1 輸入 7,5,6,4 輸出 5 限制 0 陣列長度 50000 思想是 分治演算法 所有的 逆序對 於 3 個部分 左邊區間的逆序對 右邊區間的逆序對 橫跨兩個區間的...
每日一題 合併集合
一共有 n 個數,編號是 1 n,最開始每個數各自在乙個集合中。現在要進行 m 個操作,操作共有兩種 m a b,將編號為 a 和 b 的兩個數所在的集合合併,如果兩個數已經在同乙個集合中,則忽略這個操作 q a b,詢問編號為 a 和 b 的兩個數是否在同乙個集合中 輸入格式 第一行輸入整數 n ...
K個公升序鍊錶合併 (每日一題)
給你乙個鍊錶陣列,每個鍊錶都已經按公升序排列。請你將所有鍊錶合併到乙個公升序鍊錶中,返回合併後的鍊錶。示例 輸入 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 ...