博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Leetcode 23. 合并K个升序链表
阅读量:4034 次
发布时间:2019-05-24

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

题目描述

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。

示例 1:

输入:lists = [[1,4,5],[1,3,4],[2,6]]

输出:[1,1,2,3,4,4,5,6]
解释:链表数组如下:
[
1->4->5,
1->3->4,
2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6
示例 2:

输入:lists = []

输出:[]
示例 3:

输入:lists = [[]]

输出:[]

提示:

k == lists.length

0 <= k <= 10^4
0 <= lists[i].length <= 500
-10^4 <= lists[i][j] <= 10^4
lists[i] 按 升序 排列
lists[i].length 的总和不超过 10^4

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/merge-k-sorted-lists
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

C++

方法一:分治法

/** * Definition for singly-linked list. * public class ListNode { *     int val; *     ListNode next; *     ListNode() {} *     ListNode(int val) { this.val = val; } *     ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */ /* 思路一:分治法 */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; }}

JAVA

优先队列法

/** * Definition for singly-linked list. * public class ListNode { *     int val; *     ListNode next; *     ListNode() {} *     ListNode(int val) { this.val = val; } *     ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */ /* 思路二:最小堆优先队列 用容量为K的最小堆优先队列,把链表的头结点都放进去,然后出队当前优先队列中最小的,挂上链表,,然后让出队的那个节点的下一个入队,再出队当前优先队列中最小的,直到优先队列为空。 */class Solution {
public ListNode mergeKLists(ListNode[] lists){
if(lists.length==0){
return null; } ListNode prehead=new ListNode(0); // ListNode pre=prehead; //游标 PriorityQueue
pq=new PriorityQueue<>(new Comparator
(){
@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(); pre.next=nextNode; pre=pre.next; if(nextNode.next!=null){
pq.add(nextNode.next); } } return prehead.next; } }
你可能感兴趣的文章
Selenium-ActionChains Api接口详解
查看>>
Selenium-Switch与SelectApi接口详解
查看>>
Selenium-Css Selector使用方法
查看>>
Linux常用统计命令之wc
查看>>
测试必会之 Linux 三剑客之 sed
查看>>
Socket请求XML客户端程序
查看>>
Java中数字转大写货币(支持到千亿)
查看>>
Java.nio
查看>>
函数模版类模版和偏特化泛化的总结
查看>>
VMware Workstation Pro虚拟机不可用解决方法
查看>>
最简单的使用redis自带程序实现c程序远程访问redis服务
查看>>
redis学习总结-- 内部数据 字符串 链表 字典 跳跃表
查看>>
iOS 对象序列化与反序列化
查看>>
iOS 序列化与反序列化(runtime) 01
查看>>
iOS AFN 3.0版本前后区别 01
查看>>
iOS ASI和AFN有什么区别
查看>>
iOS QQ侧滑菜单(高仿)
查看>>
iOS 扫一扫功能开发
查看>>
iOS app之间的跳转以及传参数
查看>>
iOS __block和__weak的区别
查看>>