leecode刷题(27)-- 合并k个排序链表
leecode刷题(27)-- 合并k个排序链表
合并k个排序链表
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
思路
以前做过合并两个有序链表的问题,所以刚开始想到的解法与之类似,我们可以先合并两个有序链表,再用合并的新链表去合并第三个链表:
1->1->3->4->4->5
1->1->2->3->4->4->5->6
其实如果我们学习过堆相关的知识,还可以用最小堆来解决这个问题:
- 读取所有链表值
- 构造一个最小堆(python中有 headp 方法,java中有 PriorityQueue 方法
- 根据最小堆构造一个链表
代码如下
python 描述
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
from heapq import heapify, heappop
class Solution:
def mergeKLists(self, lists: List[ListNode]) -> ListNode:
# 读取所有节点值
h = []
for node in lists:
while node:
h.append(node.val)
node = node.next
if not h:
return None
# 构造一个最小堆
heapify(h) # 转换为最小堆
# 构造链表
root = ListNode(heappop(h))
curnode = root
while h:
nextnode = ListNode(heappop(h))
curnode.next = nextnode
curnode = nextnode
return root
java 描述
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
// 读取所有节点值
List<Integer> h = new ArrayList();
for (ListNode node: lists) {
while (node != null) {
h.add(node.val);
node = node.next;
}
}
// 构造一个最小堆
if (!h.isEmpty()) return null;
PriorityQueue<ListNode> priorityQueue = new PriorityQueue();
// 将元素添加进最小堆中
for (Integer h1: h) {
priorityQueue.offer(h1);
}
//构造链表
ListNode root = priorityQueue.poll();
ListNode curNode = root;
while (!priorityQueue.isEmpty()) {
ListNode nextNode = priorityQueue.poll();
curNode.next = nextNode;
curNode = nextNode;
}
return root;
}
}
总结
上述 python 的代码能通过提交,但是 java 代码部分我快被类型转换弄晕了,代码不能通过运行,这里只是给出一种思路,日后有时间自己会再完善的,写下来也是当作自己学习记录的一部分,希望看到文章的小伙伴能帮忙指出本人的不足。
leecode刷题(27)-- 合并k个排序链表的更多相关文章
- leecode第二十三题(合并K个排序链表)
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode ...
- leetcode第23题:合并K个排序链表
首先我想到的是采用一般递归法,将K个链表合并化为(k-1)两个链表合并 class Solution: def mergeKLists(self, lists: List[ListNode]) -&g ...
- 代码题(14)— 合并有序链表、数组、合并K个排序链表
1.21. 合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出 ...
- Leetcode题库——23.合并k个排序链表
@author: ZZQ @software: PyCharm @file: mergeKLists.py @time: 2018/10/12 19:55 说明:合并 k 个排序链表,返回合并后的排序 ...
- [LeetCode] 23. 合并K个排序链表
题目链接: https://leetcode-cn.com/problems/merge-k-sorted-lists/ 题目描述: 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂 ...
- 合并K个排序链表(java实现)
题目: 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: ...
- LeetCode(23):合并K个排序链表
Hard! 题目描述: 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2-> ...
- [Swift]LeetCode23. 合并K个排序链表 | Merge k Sorted Lists
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. E ...
- 合并K个排序链表
合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1-&g ...
随机推荐
- Java 注解方式校验请求参数
1. 参数校验常用注解 注解 验证的数据类型 备注 Null 任意类型 参数值必须是 Null NotNull ...
- 20191114-4 Beta发布用户使用报告
20191114-4 Beta发布用户使用报告 此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/10007 组名:胜利点 组 ...
- java拦截器获取请求完整参数
public class OptLogAspect implements HandlerInterceptor { @Override public boolean preHandle(HttpSer ...
- Excel中,如何将人名按姓和名分开?
在Excel中,怎么将姓名分开呢? 用到三个函数: left函数:从文本字符串的左端开始,返回指定个数的字符: right函数:从字符串右端开始,返回指定个数的字符: len函数:返回文本串的字符数 ...
- eslint 检查单个文件的错误
问题: 批量检查时,没有针对性,想针对单个文件进行检查 解决办法:./node_modules/.bin/eslint your file
- js window事件解析(转载)
js-window对象的方法和属性资料 hxpd 发表于 2007-05-08 21:58:18 熟练window对象的open.close.alert.confirm.prompt.setTimeo ...
- TortoiseSvn客户端介绍
TortoiseSVN 是svn版本控制系统的一个免费开源客户端,它是svn版本控制的 Windows 扩展.可以使你避免使用枯燥而且不方便的命令行.它完全嵌入 Windows Explorer,使用 ...
- BFC是什么?有什么作用?
BFC(Block Formatting Context)直译为“块级格式化范围”. 一.常见定位方案 在讲 BFC 之前,我们先来了解一下常见的定位方案,定位方案是控制元素的布局,有三种常见方案: ...
- silverlight开发实例(Prism+MVVM+RIA)(二)--创建shell及用户登录
在上篇基本说清了本项目的基本框架,下面开始说下项目的加载和shell.开始之前在建立EF时出现了一个问题,我在数据库中建立了视图,而在EF导入视图时出现因无法匹配主键导致无法导入视图的问题,检查发现是 ...
- python汉字编解码问题
http://www.cnblogs.com/rollenholt/archive/2011/08/01/2123889.html