23. 合并K个升序链表

https://leetcode-cn.com/problems/merge-k-sorted-lists/

题目描述

方法1:顺序合并

思路

21.合并两个有序链表 的基本思路是一样的,只不过每轮操作需要比较 k 个链表节点的值。

复杂度分析

  • 时间复杂度:$O(k*n)$,k 是链表个数,n 是合并后链表的长度。

  • 空间复杂度:$O(1)$。

代码(JavaScript/C++)

JavaScript Code

C++ code

方法2:顺序合并+堆

思路

跟 方法1 思路一致,不过用了堆来寻找 k 个链表节点中的最小值。

复杂度分析

  • 时间复杂度:$O(nlogk)$,k 是链表个数,n 是合并后链表的长度。

  • 空间复杂度:$O(k)$,k 是链表个数,堆的空间大小。

代码

JavaScript Code

方法3:分治

思路

  • 将 k 个链表平均分成两份,分别进行合并后,再将两个结果进行合并。

  • 最后一步就是简单的 合并两个有序链表

  • 而中间的步骤也很简单,只需要将 k/2 个链表再细分,再细分,细分到一次只需要处理两个链表就好了。

复杂度分析

  • 时间复杂度:$O(nlogk)$,k 是链表个数,n 是合并后链表的长度。

  • 空间复杂度:$O(k)$,k 是链表个数,堆的空间大小。

代码(JavaScript/C++)

JavaScript Code

C++ Code

更多题解可以访问:https://github.com/suukii/91-days-algorithm

Last updated

Was this helpful?