LC023 合併K個公升序鍊錶

2021-10-10 16:10:48 字數 2600 閱讀 9700

給你乙個鍊錶陣列,每個鍊錶都已經按公升序排列。

請你將所有鍊錶合併到乙個公升序鍊錶中,返回合併後的鍊錶。

示例 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

需要一種輔助資料結構-,有了堆這個資料結構,難度等級是困難的題目,瞬間變成簡單了。

只把k個鍊錶的第乙個節點放入到堆中

之後不斷從堆中取出節點,如果這個節點還有下乙個節點,

就將下個節點也放入堆中

//建立乙個最小的堆,並定義好內部排序

priorityqueue

queue =

newpriorityqueue

<

>

(new

comparator

()})

; listnode dummy=

newlistnode(-

1); listnode cur=dummy;

//把每個鍊錶的第乙個節點放入到堆中

for(

int i =

0; i

// poll()把檢索並刪除此佇列的頭,如果此隊列為空,則返回 null 。

//之後不斷從堆中取出節點,如果這個節點還有下乙個節點,

//就將下個節點也放入堆中

}//兩兩合併的**,直接把下面這段**拿來用即可

public listnode merge

(listnode a, listnode b)

if(a.val <= b.val)

else

}}分治就是不斷縮小其規模,再不斷合併擴大的過程

複雜度

;}//通過mid將陣列一分為二,並不斷縮小規模,當規模為1時返回並開始合併

//通過合併兩個鍊錶,不斷增大其規模,整體看就是不斷縮小-最後不斷擴大的過程

private listnode helper

(listnode[

] lists,

int begin,

int end)

int mid=begin+

(end-begin)/2

; listnode left=

helper

(lists,begin,mid)

; listnode right=

helper

(lists,mid+

1,end)

;return

merge

(left,right);}

合併兩個有序鍊錶

public listnode merge

(listnode a, listnode b)

if(a.val <= b.val)

else

}public

class

listnode

listnode

(int val)

listnode

(int val, listnode next)

}}

合併K個公升序鍊錶

給你乙個鍊錶陣列,每個鍊錶都已經按公升序排列。請你將所有鍊錶合併到乙個公升序鍊錶中,返回合併後的鍊錶。示例 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 ...

23 合併K個公升序鍊錶

給你乙個鍊錶陣列,每個鍊錶都已經按公升序排列。請你將所有鍊錶合併到乙個公升序鍊錶中,返回合併後的鍊錶。示例 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 ...

合併K個公升序鍊錶20201225

2.優化的優先佇列 3.兩兩合併 給你乙個鍊錶陣列,每個鍊錶都已經按公升序排列。請你將所有鍊錶合併到乙個公升序鍊錶中,返回合併後的鍊錶。示例 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 將它們合併到乙...