Merge k Sorted Lists
来源:互联网 发布:冬天男鞋推荐知乎 编辑:程序博客网 时间:2024/06/07 02:05
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
思路:要快速找到k个元素中的最小值,使用堆这种数据结构。找到最小值后,还需要知道该最小值出自哪个链表,因此,堆中还需记录每个节点来自哪个链表。调整堆的时间复杂度为O(logk),所以总体时间复杂度为O(nlogk)。代码如下:
struct ListNode {int val;struct ListNode *next;};typedef struct{ int val; int index;}HeapNode;void swap(HeapNode *a, HeapNode *b){ HeapNode temp; temp = *b; *b = *a; *a = temp;}void minheapify(HeapNode *heap, int heapsize, int index){ int left, right; int key; int smallest; while(index < heapsize) { left = 2*index+1; right = 2*index+2; smallest = index; if(left < heapsize && heap[index].val > heap[left].val) { smallest = left; } if(right < heapsize && heap[smallest].val > heap[right].val) { smallest = right; } if(smallest == index) return; swap(heap+smallest, heap+index); index = smallest; }}void buildminheap(HeapNode *heap, int heapsize){ int start = (heapsize-2)/2; while(start >= 0) { minheapify(heap, heapsize, start); start--; }}struct ListNode* mergeKLists(struct ListNode** lists, int listsSize) { int i ,j; int heapsize = listsSize; int minindex = -1; struct ListNode *head = NULL; struct ListNode *node = NULL; if(listsSize == 0) return head; HeapNode *heap = calloc(heapsize, sizeof(HeapNode)); for(i = 0, j = 0; i < heapsize; i++) { if(lists[i] == NULL) { continue; } heap[j].val = lists[i]->val; heap[j].index = i; j++; } heapsize = j; if(heapsize == 0) return head; buildminheap(heap, heapsize); minindex = heap[0].index; head = lists[minindex]; node = head; lists[minindex] = lists[minindex]->next; while(1) { if(lists[minindex] == NULL) { heapsize -= 1; if(heapsize == 0) return head; swap(heap, heap+heapsize); minheapify(heap, heapsize, 0); } else { heap[0].val = lists[minindex]->val; minheapify(heap, heapsize, 0); } minindex = heap[0].index; node->next = lists[minindex]; node = node->next; lists[minindex] = lists[minindex]->next; }}
0 0
- Merge K Sorted Lists
- Merge k Sorted Lists
- Merge k Sorted Lists
- Merge K Sorted Lists
- Merge k Sorted Lists
- Merge k Sorted Lists
- Merge k Sorted Lists
- Merge k Sorted Lists
- Merge k Sorted Lists
- Merge k Sorted Lists
- Merge k Sorted Lists
- Merge k Sorted Lists
- Merge k Sorted Lists
- Merge k Sorted Lists
- Merge K sorted Lists
- Merge k Sorted Lists
- Merge k Sorted Lists
- Merge k Sorted Lists
- uva 10120(暴力+结论)
- Xcode编译 No such file or directory
- MySQL主从复制原理以及架构
- 如何让VMware上的虚拟机ping通外网(图解教程)
- 在linux(ubuntu)下部署Egret
- Merge k Sorted Lists
- MyEclipse 8.6中的Drools安装配置
- textview根据字数自动调高度,cell高度自动调节
- R语言学习(1)线性模型
- hdu 1710 Binary Tree Traversals
- 在Windows上和Linux上安装xdebug
- Python下opencv使用笔记(九)(图像直方图)
- Android - LayoutAnimation 动画效果 - 示例
- C++ 语言的 15 个晦涩特性