[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. 思 ...
随机推荐
- IPython&Jupyter私房手册
Jupyter是以Ipython为基础,可以极大的方便开发,对于如何使用,网上的资料都不太全.因此决定自己编写一个私房手册方便随时查找. 1. 安装和配置 安装不多说,不想折腾直接安装anaconda ...
- 190320运算符&数据类型
一.运算符 1.算术运算符 + 加 - 减 * 乘 / 除 ** 平方 // 整除 % 取余 2.比较运算符 == 等于 > 大于 < 小于 <= 小于等于 >= 大于等于 ! ...
- Java中的Date Time 与SQL Server 2005里的Datetime 之间的交互
Preface Environment:Platform: Windows XPLanguage: Java 1.5IDE: MyEclipse 6.0.1Database: SQL Server 2 ...
- 2.1、Softmax Regression模型
Softmax Regression模型 由于Logistics Regression算法复杂度低,容易实现等特点,在工业中的到广泛的使用,但是Logistics Regression算法主要用于处理 ...
- 在文件夹快速启动cmd或powershell
进入指定目录下的几种方法:一般方法 使用win+R的组合键进入运行窗口运行窗口输入cmd进入命令行,使用 ”cd 文件路径“进入指定的文件夹下.cd 命令的基本操作如下: 任意目录下跳转至当前驱动器的 ...
- Android 基于TCP多线程通信实现群聊天的功能
1.TCP多线程原理图 2.实现方法 (1)服务器端 (2)客户端 3.java后台代码 主界面 package com.lucky.test50socket2; import android.ann ...
- 【研究】Struts2-048漏洞
1.1 漏洞背景 2017年7月7日,Apache Struts发布最新的安全公告,Apache Struts2-strus1-plugin插件存在远程代码执行的高危漏洞,漏洞编号为CVE-2017- ...
- aoj0033
一.题意:有十个数,判断是否能分成两个递增序列 二.思路: 1.dfs:每个数判断在左边或者右边,遍历所有情况. 2.贪心:在保证递增序的前提下,判断一个数放左边或者右边,决定于其更接近于哪一边最上面 ...
- Python 读取Excel数据 xlrd
#导入相关模块 from xlrd import open_workbook #打开excel file = open_workbook("test.xlsx") #获取sheet ...
- PIE SDK地图范围设置
1.功能简介 地图范围设置主要就是对图层的地图浏览控制,例如地图的放大.缩小.漫游.全图显示.1:1视图.比例尺等功能,能更好的与地图有一个互动的地图浏览体验.PIE SDK对地图范围设置主要利用IC ...