LeetcodeOJ: Merge k Sorted Lists 归并排序+最小堆

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9
10 struct helper {
11     ListNode *head;
12     int len;
13     helper(ListNode *h, int l) : head ( h ), len ( l ) {}
14 };
15
16 class helpercmp {
17 public:
18     bool operator() (const helper &a, const helper &b) {
19         return a.len > b.len;
20     }
21 };
22
23 class Solution {
24 public:
25     priority_queue<helper, vector<helper>, helpercmp> heap;
26
27     inline int listSize(ListNode *head) {
28         int len = 0;
29         for ( ; head != nullptr; head = head->next, len++ );
30         return len;
31     }
32     ListNode *mergeKLists(vector<ListNode *> &lists) {
33         if ( lists.empty() ) return nullptr;
34         if ( lists.size() == 1 ) return lists[0];
35         ListNode *head = nullptr, *left = nullptr,  *right = nullptr;
36         for ( auto list : lists ) {
37             heap.push( helper(list, listSize(list) )  );
38         }
39         while ( heap.size() != 1 ) {
40             left = heap.top().head;
41             heap.pop();
42             right = heap.top().head;
43             heap.pop();
44             head = mergeList( left, right );
45             heap.push( helper( head, listSize(head) ) );
46         }
47         return heap.top().head;
48     }
49     ListNode *mergeList(ListNode *a, ListNode *b) {
50         ListNode dummy(0);
51         ListNode *tail = &dummy;
52         while ( a != nullptr && b != nullptr ) {
53             if ( a-> val <= b->val ) {
54                 tail->next = a;
55                 a = a->next;
56             } else {
57                 tail->next = b;
58                 b = b->next;
59             }
60             tail = tail->next;
61         }
62         tail->next =  a == nullptr ? b : a;
63         return dummy.next;
64     }
65 };
时间: 2024-08-12 00:49:49

LeetcodeOJ: Merge k Sorted Lists 归并排序+最小堆的相关文章

#23 Merge k Sorted Lists (N路归并排序)

#23 Merge k Sorted Lists (N路归并排序) 题目地址:#23 题目分类:链表/归并排序/堆排序 题目难度:hard 题目 Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 翻译:合并K个已经排序的链表,返回一个排序好的链表. 思路 暴力法,我们很容易想到:以一个for循环遍历所有的链表,找出最小的,然后将这个节点加入新的链表

LeetCode: Merge k Sorted Lists 解题报告

Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. Show Tags 参考资料: http://blog.csdn.net/linhuanmars/article/details/19899259. SOLUTION 1: 使用分治法.左右分别递归调用Merge K sorted List,然后再使用merg

Leetcode 23.Merge Two Sorted Lists Merge K Sorted Lists

Merge Two Sorted Lists Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists. 依次拼接 复杂度 时间 O(N) 空间 O(1) 思路 该题就是简单的把两个链表的节点拼接起来,我们可以用一个Dummy头,将比较过后的节点接在这个Dummy头之后.最后

[leetcode]Merge k Sorted Lists @ Python

原题地址:https://oj.leetcode.com/problems/merge-k-sorted-lists/ 题意:Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 解题思路:归并k个已经排好序的链表.使用堆这一数据结构,首先将每条链表的头节点进入堆中,然后将最小的弹出,并将最小的节点这条链表的下一个节点入堆,依次类推,最终形成的链表就是归

LeetCode 21 23:Merge Two Sorted Lists &amp; Merge K Sorted Lists

LeetCode 21: Merge Two Sorted Lists Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists. 题目分析:对两个有序列表进行合并,这个是数据结构基本题目比较简单,代码如下(这个代码有点长,可以简化): ListNode *mergeTwoL

【leetcode刷题笔记】Merge k Sorted Lists

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 题解:最开始用了最naive的方法,每次在k个链表头中找出最小的元素,插入到新链表中.结果果断TLE了. 分析一下,如果这样做,每取出一个节点,要遍历k个链表一次,假设k个链表一共有n个节点,那么就需要O(nk)的时间复杂度. 参考网上的代码,找到了用最小堆的方法.维护一个大小为k的最小堆,存放当前k

【leetcode】Merge k Sorted Lists

Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 采用优先队列priority_queue 把ListNode放入优先队列中,弹出最小指后,如果该ListNode有下一个元素,则把下一个元素放入到队列中 1 /** 2 * Definition for singly-linked list. 3 * stru

Merge k Sorted Lists

Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 根据k个已经排好序的链表构造一个排序的链表,采用类似归并排序的算法可以通过测试 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next;

[LeetCode]23. Merge k Sorted Lists

23. Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 给定k个排序了的链表,合并k个链表成一个排序链表. 本程序思路: 1)首先得到K个链表的长度和存在len中 2)从K个链表中找到值最小的那个节点,把该节点添加到合并链表中 3)重复len次即可把所有节点添加到合并链表中. 注意事项: 1)K个链表中有的