leetcode每日一題 合併k個排序鍊錶

2021-10-05 12:15:49 字數 1306 閱讀 1490

合併 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 ...