23. 合并K个排序链表

合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。

示例:

输入:

[

1->4->5,

1->3->4,

2->6

]

输出: 1->1->2->3->4->4->5->6

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/merge-k-sorted-lists

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

PS:直接用PriorityQueue自动排序,改写一下compare方法。

/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode mergeKLists(ListNode[] lists) { if (lists.length == 0) {
return null;
} ListNode dummyHead = new ListNode(0);
ListNode curr = dummyHead;
PriorityQueue<ListNode> pq = new PriorityQueue<>(new Comparator<ListNode>() {
@Override
public int compare(ListNode o1, ListNode o2) {
return o1.val - o2.val;
}
}); for (ListNode list : lists) {
if (list == null) {
continue;
}
pq.add(list);
} while (!pq.isEmpty()) {
ListNode nextNode = pq.poll();
curr.next = nextNode;
curr = curr.next;
if (nextNode.next != null) {
pq.add(nextNode.next);
}
}
return dummyHead.next;
}
}

PS:分治

/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode mergeKLists(ListNode[] lists){
if(lists.length == 0)
return null;
if(lists.length == 1)
return lists[0];
if(lists.length == 2){
return mergeTwoLists(lists[0],lists[1]);
} int mid = lists.length/2;
ListNode[] l1 = new ListNode[mid];
for(int i = 0; i < mid; i++){
l1[i] = lists[i];
} ListNode[] l2 = new ListNode[lists.length-mid];
for(int i = mid,j=0; i < lists.length; i++,j++){
l2[j] = lists[i];
} return mergeTwoLists(mergeKLists(l1),mergeKLists(l2)); }
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1 == null) return l2;
if (l2 == null) return l1; ListNode head = null;
if (l1.val <= l2.val){
head = l1;
head.next = mergeTwoLists(l1.next, l2);
} else {
head = l2;
head.next = mergeTwoLists(l1, l2.next);
}
return head;
}
}

最新文章

  1. linux 如何查找io的进程
  2. p2p音视频通信
  3. Electron-使用Electron开发第一个应用
  4. 探索Microsoft.NET目录
  5. ArcGIS Engine生成等值线(C#)
  6. volatile的使用原则
  7. canvas学习总结六:绘制矩形
  8. HTML基础加强
  9. python学习第八讲,python中的数据类型,列表,元祖,字典,之字典使用与介绍
  10. Kali Linux入坑之基本配置(2018.1)
  11. 七 Struts2 文件上传和下载
  12. FT View SE联合Studio 5000仿真
  13. 流网络分析系统-SNAS
  14. Prometheus监控学习笔记之Prometheus普罗米修斯监控入门
  15. gitlab git
  16. C3P0连接池使用教程
  17. 下拉刷新 上拉更多 支持ListView GridView WebView【转载】
  18. Python中通过open()操作文件时的文件中文名乱码问题
  19. 将禅道部署到腾讯云linux 上
  20. Shiro认证的另一种方式

热门文章

  1. Django :Content-Type组件
  2. SpringMVC 自定义全局PropertyEditor
  3. API 网关 Kong
  4. Spring Boot 使用 JSR303 实现参数验证
  5. 使用python对oracle进行简单性能测试
  6. 用matplotlib和pandas绘制股票MACD指标图,并验证化交易策略
  7. vue-cli搭建vue项目
  8. EMAIL、用户名测试点
  9. 坑爹的cmd(整人专用)
  10. LaunchScreen作为启动图设置,修改无效的解决方案