LeetCode23 合併K個有序鍊錶

2021-10-21 18:07:43 字數 2182 閱讀 3981

leetcode23 - 合併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->4->4->5->6

示例 2:

輸入:lists =

輸出:示例 3:

輸入: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

合併k個有序鍊錶,時間複雜度和空間複雜度有限制

解法一:優先佇列求解,放乙個排序一次logk,一共放n次,複雜度是nlogk

/**

* definition for singly-linked list.

* public class listnode

*     listnode(int val)

*     listnode(int val, listnode next)

* }*/class solution

}listnode list = new listnode(0);

listnode tmp = list;

// 將佇列元素取出構建鍊錶

while(!queue.isempty())

return list.next;

}}

解法二(重點掌握):優先佇列求解,複雜度是nlogk,k 指標指向 k 條鍊錶,每次使用小根堆來 logk 求出最小值,一共n個元素

/**

* definition for singly-linked list.

* public class listnode

*     listnode(int val)

*     listnode(int val, listnode next)

* }*/class solution

listnode list = new listnode(0);

listnode tmp = list;

// 將佇列元素取出構建鍊錶

while(!queue.isempty())

}return list.next;

}}

解法三:兩兩合併,時間複雜度,nk

/*** definition for singly-linked list.

* public class listnode

*     listnode(int val)

*     listnode(int val, listnode next)

* }*/class solution else if(lists.length == 2) else

*     listnode(int val)

*     listnode(int val, listnode next)

* }*/class solution {

public listnode mergeklists(listnode lists) {

if(lists == null || lists.length == 0) return null;

listnode ret = new listnode(0);

listnode temp = ret;

int n = lists.length;

// 當lists就剩1個鍊錶停止

while(n>1) {

// 從lists的第0個鍊錶開始合併

int idx = 0;

for(int i=0; i

LeetCode 23 合併 K個排序序列

合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。示例 輸入 1 4 5,1 3 4,2 6 輸出 1 1 2 3 4 4 5 6 解題思路 採用分治的思想,將 k 個鍊錶的合併問題轉換成,合併 2 個有序鍊錶的問題 typedef struct listnode list 定...

Leetcode23 合併K個排序鍊錶

題目 解題思路 這道題使用的是分治演算法。首先還用輔助函式mergetwolists 用來合併兩個有序單鏈表,不申請額外的空間實現原地合併。如下 listnode mergetwolists listnode l1,listnode l2 else head nexthead while l1 nu...

leetcode 23 合併K個排序鍊錶

合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。示例 輸入 1 4 5,1 3 4,2 6 輸出 1 1 2 3 4 4 5 6分析 我想是k次歸併。時間複雜度是 k 1 nlogn。題目分析 本題首先將每個鍊錶的首元素取出,構建乙個最小堆。堆頂則為最小的元素,用最小元素所在...