LeetCode系列23 合併K個公升序鍊錶

2021-10-10 23:30:35 字數 2528 閱讀 6186

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

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

前置知識:合併兩個有序鍊錶,**如下,時間複雜度o(n

)o(n)

o(n)

,空間複雜度為o(1

)o(1)

o(1)

listnode*

mergetwolists

(listnode *a, listnode *b)

else

tail = tail-

>next;

} tail-

>next =

(aptr ? aptr : bptr)

;return head.next;

}

這道題有很多解法,我們來看看吧,假設有k個鍊錶,每個鍊錶的長度為n

方法一:暴力求解

遍歷所有鍊錶,將所有值存入到乙個陣列中,對陣列進行快速排序,然後通過陣列構造鍊錶

時間複雜度為o(k

nlog

(kn)

)o(knlog(kn))

o(knlo

g(kn

)),空間複雜度為o(n

)o(n)

o(n)

方法二:逐步比較

與合併兩個有序鍊錶類似,每一步比較 k 個鍊錶的首元素,將最小的新增到新構造的鍊錶中

時間複雜度為o(k

2n

)o(k^2n)

o(k2n)

,空間複雜度為o(n

)o(n)

o(n)

方法三:優先佇列

遍歷所有鍊錶,將所有值存入優先佇列中,然後依次取出構造鍊錶

時間複雜度為o(k

n×lo

gk

)o(kn\times logk)

o(kn×l

ogk)

,空間複雜度為o(n

)o(n)

o(n)

,**如下:

class

solution};

priority_queue q;

listnode*

mergeklists

(vector>

& lists));

} listnode head,

*tail =

&head;

while

(!q.

empty()

));}

return head.next;}}

;

方法四:順序合併

第乙個鍊錶和第二個鍊錶合併,然後用合併的結果與接下來的鍊錶合併

時間複雜度為o(k

2n

)o(k^2n)

o(k2n)

,空間複雜度為o(1

)o(1)

o(1)

,**如下:

class

solution

else

tail = tail-

>next;

} tail-

>next =

(aptr ? aptr : bptr)

;return head.next;

} listnode*

mergeklists

(vector>

& lists)

return ans;}}

;

方法五:分治合併

此題的最佳解法,將k個鍊錶配對並將同一對中的鍊錶合併, 第一輪合併後,k 個鍊錶被合併成k / 2個,下一輪被合併成k / 4個,依此類推,直到得到最終的有序鍊錶

時間複雜度為o(k

n×lo

gk

)o(kn\times logk)

o(kn×l

ogk)

,空間複雜度為o(l

ogk)

o(logk)

o(logk

),**如下:

class

solution

else

tail = tail-

>next;

} tail-

>next =

(aptr ? aptr : bptr)

;return head.next;

} listnode*

merge

(vector >

&lists,

int l,

int r)

listnode*

mergeklists

(vector>

& lists)

};

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 定...

leetcode 23 合併K排序鍊錶

合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。示例 輸入 1 4 5,1 3 4,2 6 輸出 1 1 2 3 4 4 5 6 解析 看到這一題,馬上就能想到之前的合併兩個鍊錶leetcode 21.合併兩個有序鍊錶 這一題相當於上一題的公升級版,從合併的實現方法上來說可以...

leetcode 合併K個公升序鍊錶 23

給你乙個鍊錶陣列,每個鍊錶都已經按公升序排列。請你將所有鍊錶合併到乙個公升序鍊錶中,返回合併後的鍊錶。遍歷所有鍊錶將節點值加入列表中,對列表進行公升序 根據列表建立新的鍊錶 將所有鍊錶元素新增至列表中,然後對列表進行排序,然後基於列表建立鍊錶,def mergeklists v0 self,list...