用最小堆将k个已排序链表合并为一个排序链表
2014-04-02 16:36
211 查看
问题:请给出一个时间为O(nlgk),用来将k个已排序链表合并为一个排序链表的算法。此处的n为所有输入链表中元素的总数。
编程思路:
假设k个链表都是非降序排列的。
(1)取k个元素建立最小堆,这k个元素分别是k个链表的第一个元素。建堆的时间复杂度O(k)。
(2)堆顶元素就是k个链表中最小的那个元素,取出它。时间复杂度O(1)。
(3)若堆顶元素所在链表不为空,则取下一个元素放到堆顶位置,这可能破坏了最小堆性质,所以进行堆调整。堆调整时间复杂度O(lgk)。若为空,则此子链表已经被合并完毕,则删除最小堆的堆顶元素,此时最小堆的heapSize减小了1 。删除指定元素时间复杂度O(lgk)。
(4)重复步骤(2)~(3)n-k次。总的时间复杂度是O(k)+O(nlgk)即O(nlgk)。
编程思路:
假设k个链表都是非降序排列的。
(1)取k个元素建立最小堆,这k个元素分别是k个链表的第一个元素。建堆的时间复杂度O(k)。
(2)堆顶元素就是k个链表中最小的那个元素,取出它。时间复杂度O(1)。
(3)若堆顶元素所在链表不为空,则取下一个元素放到堆顶位置,这可能破坏了最小堆性质,所以进行堆调整。堆调整时间复杂度O(lgk)。若为空,则此子链表已经被合并完毕,则删除最小堆的堆顶元素,此时最小堆的heapSize减小了1 。删除指定元素时间复杂度O(lgk)。
(4)重复步骤(2)~(3)n-k次。总的时间复杂度是O(k)+O(nlgk)即O(nlgk)。
相关文章推荐
- 堆排序之“用最小堆将k个已排序链表合并为一个排序链表”
- 第六章堆排序之“用最小堆将k个已排序链表合并为一个排序链表”(练习6.5-8)
- 第六章堆排序之“用最小堆将k个已排序链表合并为一个排序链表”(练习6.5-8)
- “用最小堆将k个已排序链表合并为一个排序链表”(算法导论 练习6.5-9)
- Leetcode 23. Merge k Sorted Lists合并k个排序链表
- 已知两个链表 la和 lb,其元素值递增排序。编程将la和lb合并成一个递减有序(相同值元素只保留一个)的链表lc。(北方名校经典试题) 本题选做
- lintcode--合并k个排序链表
- lintcode-104-合并k个排序链表
- 算法导论第三版第六章 合并K个有序链表的三种解法(最小堆法和分治递归法)
- 104. 合并k个排序链表
- K个有序链表共N个结点在O(NlgK)时间合并为一个新的有序链表头文件C语言
- CPP一个链表,数据的增删改查(不包括翻转、排序,合并等)等,Node* &的使用
- LeetCodet题解--23. Merge k Sorted Lists(合并K个已排序的链表)
- 无序链表合并为一个有序链表,且排序后链表中无重复元素
- 算法导论第三版第六章 合并K个有序链表的三种解法(最小堆法和分治递归法)
- 链表——合并K个排序的链表
- leetcode 23. Merge k Sorted Lists 合并k个排序链表 优先级队列
- K个有序链表共N个结点在O(NlgK)时间合并为一个新的有序链表实现文件C语言
- LintCode--合并k个排序链表
- 合并k个已排序的链表