104-合并k个排序链表

合并k个排序链表,并且返回合并后的排序链表。尝试分析和描述其复杂度。

样例

给出3个排序链表[2->4->null,null,-1->null],返回 -1->2->4->null

标签

链表 分治法 堆 优先队列 优步 谷歌 推特 领英 爱彼迎 脸书

方法一(最简单,但效率不高)

每次从当前K个链表中,选取值最小的节点,加入已排序链表中

code

/**
* Definition of ListNode
* class ListNode {
* public:
* int val;
* ListNode *next;
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param lists: a list of ListNode
* @return: The head of one sorted list.
*/
ListNode *mergeKLists(vector<ListNode *> &lists) {
// write your code here
ListNode * newHead = new ListNode(-1);
ListNode * current = newHead; while(!isAllListEmpty(lists)) {
current->next = findMin(lists);
current = current->next;
} return newHead->next;
} bool isAllListEmpty(vector<ListNode *> &lists) {
for(int i=0; i<lists.size(); i++) {
if(lists[i] != NULL) {
return false;
}
}
return true;
} ListNode *findMin(vector<ListNode *> &lists) {
int minValue = 0x7FFFFFFF;
int minIndex = 0;
ListNode * result = NULL; for(int i=0; i<lists.size(); i++) {
if(lists[i] != NULL && lists[i]->val < minValue) {
minValue = lists[i]->val;
result = lists[i];
minIndex = i;
}
}
lists[minIndex] = lists[minIndex]->next;
return result;
}
};

方法二(使用最小堆)

方法一的时间消耗主要体现于在 k 个链表中寻找最小值,每次寻找最小值都需要 O(k) 的时间复杂度,所以可以采用最小堆,将 k 个链表的表头放入堆中,它们会自动排好序。然后取出堆顶元素加入已排序链表,把取出元素的下一个元素再加入堆中。以此类推,直至堆空。

code

/**
* Definition of ListNode
* class ListNode {
* public:
* int val;
* ListNode *next;
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param lists: a list of ListNode
* @return: The head of one sorted list.
*/
struct cmp {
bool operator () (ListNode *a, ListNode *b) {
return a->val > b->val;
}
}; ListNode *mergeKLists(vector<ListNode *> &lists) {
// write your code here
priority_queue<ListNode*, vector<ListNode*>, cmp> minHeap; for(int i=0; i<lists.size(); i++) {
if(lists[i] != NULL) {
minHeap.push(lists[i]);
}
} ListNode *newHead = NULL, *current = NULL, *temp = NULL;
while (!minHeap.empty()) {
temp = minHeap.top();
minHeap.pop(); if (current == NULL) {
newHead = temp;
}
else {
current->next = temp;
}
current = temp;
if (temp->next != NULL) {
minHeap.push(temp->next);
}
}
return newHead;
}
};

最新文章

  1. 《Entity Framework 6 Recipes》中文翻译系列 (37) ------ 第六章 继承与建模高级应用之独立关联与外键关联
  2. 浏览器主页被hao123贱贱的篡改的一种方式
  3. Open Cascade DataExchange DXF
  4. Android学习笔记之短信验证码的获取和读取
  5. List&lt;T&gt;保存为XML文件
  6. Android编译选项eng、user、userdebug的区别
  7. viewDidLoad &amp;&amp; loadView
  8. Java 使用对话框选择文件并输出到控制台
  9. iOS-GCD多线程
  10. uva-442 Matrix Chain Multiplication
  11. python入门(Python和Pycharm安装)
  12. Chapter 2 User Authentication, Authorization, and Security(3):保护服务器避免暴力攻击
  13. Spring Webflux: Kotlin DSL [片断]
  14. JavaSSM框架报HTTP Status 500 - Servlet.init() for servlet springMvc threw exception错误
  15. Emacs中的拼写检查
  16. one list to muti list
  17. 解题报告 『[USACO08NOV]Mixed Up Cows(状压动规)』
  18. HTTP消息头(HTTP headers)-常用的HTTP请求头与响应头
  19. [Android] 基于 Linux 命令行构建 Android 应用(六):Android 应用签名
  20. XML与 实体的相互转化

热门文章

  1. rank() over,dense_rank() over,row_number() over的区别
  2. spring入门(二) 使用注解代替xml配置
  3. idea开启自动编译
  4. c# 动态编译继承接口
  5. window.location.href url含中文乱码问题
  6. js替换字符串中的空格,换行符\r\n或\n替换成&lt;br&gt;
  7. 【2018 ICPC南京网络赛 A】An Olympian Math Problem(数论题)
  8. 最长递增子序列(51Nod - 1134)
  9. 小程序登录 -41003: aes 小程序加密数据解密失败问题
  10. CentOS 7 以上防火墙简单配置