O(N lgK) 时间内合并K个有序链表
来源:互联网 发布:linux 打包压缩文件夹 编辑:程序博客网 时间:2024/04/30 09:34
问题:
在O(N lgK) 时间内合并K个有序链表, 这里N指的是K个链表中所有的元素个数。
分析:
这是一道非常经典的面试题,在很多大公司的面试题中,此题频繁出现。这题也是算法导论的作业题。
这题的思路如下:
1) 在每一个链表中取出第一个值,然后把它们放在一个大小为K的数组里,然后把这个数组当成heap,然后把该堆建成最小堆。此步骤的时间复杂度为O(K)
2 )取出堆中的最小值(也是数组的第一个值),然后把该最小值所处的链表的下一个值放在数组的第一个位置。如果链表中有一个已经为空(元素已经都被取出),则改变heap的大小。然后,执行MIN-HEAPIFY操作,此步骤的时间复杂度为O(lg K).
3 ) 不断的重复步骤二,直到所有的链表都为空。
代码如下:
- public void minHeapify(Node[] node, int index, int size) {
- int left = 2 * index + 1;
- int right = 2 * index + 2;
- int smallest;
- if (left < size && node[left].data < node[index].data) {
- smallest = left;
- } else {
- smallest = index;
- }
- if (right < size && node[right].data < node[smallest].data) {
- smallest = right;
- }
- if (smallest != index) {
- exchange(node, smallest, index);
- minHeapify(node, smallest, size);
- }
- }
- public void buildMinHeap(Node[] node, int size) {
- for (int i = size / 2 - 1; i >= 0; i--) {
- minHeapify(node, i, size);
- }
- }
- public Node mergeKSortedList(Node[] heads) {
- Node head = null; // the head of the merged list
- Node current = null;
- int size = heads.length;
- Node[] heap = new Node[heads.length]; // create a heap
- // initialize the value of the heap
- for (int i = 0; i < heads.length; i++) {
- heap[i] = heads[i];
- heads[i] = heads[i].next;
- }
- // create a min heap
- buildMinHeap(heap, size);
- int tempSize = size;
- while (size > 0) {
- if (head == null) {
- head = heap[0];
- current = head;
- } else {
- current.next = heap[0];
- current = current.next;
- }
- if (heap[0].next == null) {
- size--;
- } else {
- heap[0] = heap[0].next;
- }
- // if the size of heap changes, we need to move all the elements in the heap to
- // the front of the heap
- if (size != tempSize) {
- for (int i = 0; i < size; i++) {
- heap[i] = heap[i+1];
- }
- tempSize = size;
- }
- minHeapify(heap, 0, size);
- }
- return head;
- }
0 0
- O(N lgK) 时间内合并K个有序链表
- O(N lgK) 时间内合并K个有序链表
- O(N lgK) 时间内合并K个有序链表
- 在O(N lgK) 时间内合并K个有序链表
- 合并K个有序链表O(N lgK)
- K个有序链表共N个结点在O(NlgK)时间合并为一个新的有序链表实现文件C语言
- LeetCode 合并k个有序链表
- 合并k个有序链表
- 合并k个有序链表
- 合并K个有序链表
- 合并k个有序的链表
- 在O(n)时间内找出最小的k个元素
- K个有序链表共N个结点在O(NlgK)时间合并为一个新的有序链表头文件C语言
- 合并k个有序链表 Merge k Sorted Lists
- 合并K个有序链表-堆的使用
- 经典算法——合并K个有序链表
- 在O(n)时间内找出n个数中的第k个(《编程珠玑》第11章)
- 23.合并k个有序表
- android 自定义view中onMeasure()理解
- JVM性能调优
- POJ 3690 Intervals 费用流 最大变最小
- hdu 4730 We Love MOE Girls(水题)
- 给晕针的童鞋一些参考
- O(N lgK) 时间内合并K个有序链表
- 《MFC游戏开发》笔记二 建立工程、调整窗口
- java-- 学生介绍
- 跳转到系统短信界面和预设短信内容
- Codeforces Round #265 (Div. 2)D(判断立方体)
- android学习笔记【1】KEYCODE列表
- 《MFC游戏开发》笔记三 游戏贴图与透明特效的实现
- Codeforces Round #265 (Div. 2)E(数位dp)
- 《MFC游戏开发》笔记四 键盘响应和鼠标响应:让人物动起来