博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Leetcode | Merge k Sorted Lists
阅读量:7021 次
发布时间:2019-06-28

本文共 3100 字,大约阅读时间需要 10 分钟。

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

想法很简单,就是两两合并。在Merge Two Sorted Lists这道题已经实现了两两合并的代码了,就直接拿过来用。

假设每条链平均长度为n,如果用二分法的话, 也就是将所有的链分成两份,每份各自合并完之后再合并起来。递归的空间复杂度会是O(logk), 时间复杂度T(k)=2T(k/2) +O(nk),由主定理得O(nklgk)。

主定理见。

下面是两两合并的代码,时间复杂度是$O(2n+3n+\ldots+kn)=O(k^2n)$.

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 class Solution {10 public:11     ListNode *mergeKLists(vector
&lists) {12 if (lists.empty()) return NULL;13 ListNode* head = lists[0];14 for (int i = 1; i < lists.size(); ++i) {15 head = mergeTwoLists(head, lists[i]);16 }17 18 return head;19 }20 21 ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) {22 ListNode *head, *t3;23 head = t3 = new ListNode(0);24 while (l1 != NULL && l2 != NULL) {25 if (l1->val <= l2->val) {26 t3->next = l1;27 l1 = l1->next;28 } else {29 t3->next = l2;30 l2 = l2->next;31 }32 t3 = t3->next;33 }34 35 while (l1 != NULL) {36 t3->next = l1;37 t3= t3->next;38 l1 = l1->next;39 }40 while (l2 != NULL) {41 t3->next = l2;42 t3 = t3->next;43 l2 = l2->next;44 }45 46 ListNode *ret = head->next;47 delete head;48 return ret;49 }50 };

 下面是二分的实现。

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 class Solution {10 public:11     ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) {12         ListNode h(0), *p = &h;13         while (l1 || l2) {14             if (l1 == NULL || (l2 != NULL && l2->val < l1->val)) {15                 p->next = l2;16                 l2 = l2->next;17             } else {18                 p->next = l1;19                 l1 = l1->next;20             }21             p = p->next;22         }23         return h.next;24     }25     ListNode *mergeKLists(vector
&lists) {26 if (lists.empty()) return NULL;27 28 vector
> layers(2);29 int cur = 0, next = 1;30 layers[cur] = lists;31 while (layers[cur].size() > 1) {32 layers[next].clear();33 for (int i = 0; i < layers[cur].size(); i += 2) {34 if (i + 1 < layers[cur].size()) layers[next].push_back(mergeTwoLists(layers[cur][i], layers[cur][i + 1]));35 else layers[next].push_back(layers[cur].back());36 }37 cur = !cur; next = !next;38 }39 return layers[cur][0];40 }41 };

非递归的空间复杂度可以优化到O(k)。

转载于:https://www.cnblogs.com/linyx/p/3704473.html

你可能感兴趣的文章
java 如何调用存储过程_Java中存储过程的调用
查看>>
java偏好设置_Linux中不同用户下的Java系统偏好设置
查看>>
java种线程池多线程有返回值_Java多线程-新特性-有返回值的线程
查看>>
java axis2小实例_[图解教程] Axis2与Eclipse整合开发Web Service之一:简单的计算服务例子...
查看>>
java hashmap比较_Java中对HashMap的深度分析与比较
查看>>
Java季度半年_java获取当前年、半年、季度、月、日、小时 开始结束时间等
查看>>
java手写算法_java笔试手写算法面试题大全含答案
查看>>
JAVA响应ajax请求的_springmvc接受及响应ajax请求。 以及@RequestBody 和@ResponseBody注解的使用...
查看>>
jq.$post传递参数给php,通过JQuery ajax.post将JSON数据提交到PHP
查看>>
网站php上传服务器,PHP多个文件上传到服务器实例
查看>>
php用户登录论坛系统,discuz论坛用户登录后台程序代码_PHP教程
查看>>
php 微信小程序 循环 多选,微信小程序复选框实现多选一功能过程解析
查看>>
fork+exit+php,php实现简单的守护进程创建、开启与关闭操作
查看>>
百度 bae php,利用百度BAE搭建免费CDN
查看>>
vue php axios 跨域,在vue中如何使用axios进行跨域处理
查看>>
php 绝对路径变成相对路径,php 相对路径转成绝对路径的实现方法
查看>>
php获取163邮件,用php得到163的邮件信息_PHP教程
查看>>
有限状态机框架php,Leetcode 65 Valid Number DFA有限状态机
查看>>
mysql分页sql语句优化,mysql 百万条数据分页优化
查看>>
php echo斜体,Markdown语言小记
查看>>