[LeetCode]23. Merge k Sorted Lists合并K个排序链表
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
Example:
Input:
[
1->4->5,
1->3->4,
2->6
]
Output: 1->1->2->3->4->4->5->6
要合并K个排好序的链表,我用的方法是用一个优先队列每次存K个元素在队列中,根据优先队列的属性把小的数放在最前面,这样每次
取出队首就是我们要的,这样把K个链表全部过一遍优先队列就得到了排好序的新序列,不了解优先队列的可以看这里http://www.importnew.com/6932.html
(这里比较奇怪的是我自己的从测试代码是没问题的,第一个测试样例过了但是提交却显示)
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
Comparator<ListNode> idComparator=new Comparator<ListNode>() {
@Override
public int compare(ListNode l1,ListNode l2) {
return l1.val-l2.val;
}
};
int len=lists.length;
Queue<ListNode> q=new PriorityQueue<ListNode>(len,idComparator);
for(int i=0;i<len;i++) {
if(lists[i]!=null) q.add(lists[i]);
}
ListNode res=new ListNode(0), head=res,temp=null;
while(!q.isEmpty()) {
temp=q.poll();
head.next=temp;
head=head.next;
if(temp.next!=null) q.add(temp.next);
}
return res.next;
}
}
下面是我的测试代码
public class Test { public static void main(String[] args) {
Random rand=new Random();
int max=0;
ListNode t1=new ListNode(-1);
ListNode l1=t1;
int a=0;
for(int i=0;i<5;i++) {
a=rand.nextInt(100);
if(a>max) max=a;
t1.next=new ListNode(max);
t1=t1.next;
} ListNode t2=new ListNode(-1);
ListNode l2=t2;
int b=0;
max=b;
for(int i=0;i<7;i++) {
b=rand.nextInt(100);
if(b>max) max=b;
t2.next=new ListNode(max);
t2=t2.next;
} ListNode t3=new ListNode(-1);
ListNode l3=t3;
int c=0;
max=c;
for(int i=0;i<3;i++) {
c=rand.nextInt(100);
if(c>max) max=c;
t3.next=new ListNode(max);
t3=t3.next;
} ListNode[] lists= {l1.next,l2.next,l3.next};
ListNode temp=new ListNode(-1); Solution s=new Solution();
temp=s.mergeKLists(lists); while(temp!=null) {
System.out.print(temp.val+"--->");
temp=temp.next;
}
}
} class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
Comparator<ListNode> idComparator=new Comparator<ListNode>() {
@Override
public int compare(ListNode l1,ListNode l2) {
return l1.val-l2.val;
}
};
int len=lists.length;
Queue<ListNode> q=new PriorityQueue<ListNode>(len,idComparator);
for(int i=0;i<len;i++) {
if(lists[i]!=null) q.add(lists[i]);
}
ListNode res=new ListNode(0), head=res,temp=null;
while(!q.isEmpty()) {
temp=q.poll();
head.next=temp;
head=head.next;
if(temp.next!=null) q.add(temp.next);
}
return res.next;
}
}
我自己测试是没有问题的,但是提交不过也没弄明白
下面是c++版本的代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
struct cmp {
bool operator () (ListNode *a, ListNode *b) {
return a->val > b->val;
}
}; class Solution {
public:
ListNode *mergeKLists(vector<ListNode *> &lists) {
priority_queue<ListNode*, vector<ListNode*>, cmp> q;
for (int i = ; i < lists.size(); ++i) {
if (lists[i]) q.push(lists[i]);
}
ListNode *head = NULL, *pre = NULL, *tmp = NULL;
while (!q.empty()) {
tmp = q.top();
q.pop();
if (!pre) head = tmp;
else pre->next = tmp;
pre = tmp;
if (tmp->next) q.push(tmp->next);
}
return head;
}
};
优先队列的底层是通过的小根堆实现的,通过compare把小的元素放在前面,取出队首后维护这个小根堆,元素加入堆中的复杂度为O(longk),总共有kn个元素加入堆中,因此,是O(nklogk)
[LeetCode]23. Merge k Sorted Lists合并K个排序链表的更多相关文章
- [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 t ...
- LeetCode 21. Merge Two Sorted Lists合并两个有序链表 (C++)
题目: Merge two sorted linked lists and return it as a new list. The new list should be made by splici ...
- 【LeetCode每天一题】Merge Two Sorted Lists(合并两个排序链表)
Merge two sorted linked lists and return it as a new list. The new list should be made by splicing t ...
- leetcode 21 Merge Two Sorted Lists 合并两个有序链表
描述: 合并两个有序链表. 解决: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { if (!l1) return l2; if (!l2) ...
- 【LeetCode】Merge Two Sorted Lists(合并两个有序链表)
这道题是LeetCode里的第21道题. 题目描述: 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1-&g ...
- [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 t ...
- [LeetCode] 23. Merge k Sorted Lists 合并k个有序链表
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. E ...
- 【LeetCode】23. Merge k Sorted Lists 合并K个升序链表
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:合并,链表,单链表,题解,leetcode, 力扣,Py ...
- [LeetCode] Merge k Sorted Lists 合并k个有序链表
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 这 ...
- [Leetcode] Merge k sorted lists 合并k个已排序的链表
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 思 ...
随机推荐
- 「BZOJ1433」[ZJOI2009] 假期的宿舍(二分图,网络流)
题目描述 学校放假了 · · · · · · 有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题.比如 A 和 B 都是学校的学生,A 要回家,而 C 来看B,C 与 A 不认识. ...
- 【spring cloud】并发测试问题
一,问题 并发测试,对外接口测试50个并发的时候开发报错,报错信息类似如下: {"status":"0500","message":&qu ...
- Windows下Python第三方.whl的安装
1.改成.zip 2.解压 3.然后把解压出来的文件放到C:\Python27\Lib\site-packages下即可.
- 消息队列 简单demo
可以使用Windows自带计划任务执行Receive操作. 控制面板=>管理工具 计划任务 =>创建计划任务 step : http://www.2cto.com/kf/201402/27 ...
- day--86(MongoDB数据库)
mongodb数据库基本操作指令 ps::mongodb中的 文档,集合的概念(和mysql中的表对比理解): 集合(mongodb)--相当于mysql中的表 文档(mongodb)--相当于mys ...
- Python web前端 07 函数及作用域
Python web前端 07 函数及作用域 一.函数 1.有名函数和匿名函数 #函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块 #函数就是包裹在花括号里面的代码块,前面使用了关键字fun ...
- vue的eventBus
首先在main.js中 Vue.prototype.$eventBus = new Vue() A组件中通过触发事件或者其他什么,然后发射数据 this.$eventBus.$emit('key',' ...
- linux下忘记mysql的root密码
一.处理方案 #1. 结束当前正在运行的mysql进程 /etc/init.d/mysql stop #2. 用mysql安全模式运行并跳过权限验证 mysqld_safe --user=mysql ...
- Zabbix触发器函数之count函数
一.背景 zabbix监控中我们用的最多的是count这个函数,通过确认多次可以减少很多误告警,提高了运维效率.可以设置连续几次都异常才发出告警,这样一来,只要发出告警基本上就已经确定发生故障了. 二 ...
- 关于表格合并span-method方法的补充(表格数据由后台动态返回)
之前写了一些关于element-ui表格合并的方法,不过用的数据都是确定的数据(死数据),但是很多时候我们的数据都是通过后台获得的,数据不稳定,这个时候使用表格合并就需要先处理一下数据,先看一下一种很 ...