本题是本人字节跳动一面考的算法题
原题是有序数组,一时没想到怎么解决数组的问题,但是如果给的是有序链表数组,则可以用下面的方法解决 可以利用最小堆完成,时间复杂度是O(nklogk),具体过程如下: 创建一个大小为k的最小堆,堆中元素为k个链表中的每个链表的第一个元素
重复下列步骤
每次从堆中取出最小元素(堆顶元素),并将其存入输出数组中
用堆顶元素所在链表元素的下一元素将堆顶元素替换掉,
初始化最小堆的时间复杂度O(k),总共有kn次循环,每次循环调整最小堆的时间复杂度是O(logk)
,所以总的时间复杂度是O(knlogk)
import java.util.ArrayList;
import java.util.Comparator;
import java.util.PriorityQueue; public class 合并K个有序数组 {
public static ListNode merge(ListNode[] arr) {
int k = arr.length;
ListNode dumy = new ListNode(-1);
ListNode p = dumy; PriorityQueue<ListNode> maxHeap = new PriorityQueue<>(k, new Comparator<ListNode>() {
@Override
public int compare(ListNode o1, ListNode o2) {
return o1.val - o2.val;
}
}); for (int i = 0; i < k; i++)
maxHeap.offer(arr[i]); while (!maxHeap.isEmpty()) {
ListNode tmp = maxHeap.poll();
if (tmp.next != null)
maxHeap.offer(tmp.next);
p.next = tmp;
p = p.next;
}
return dumy.next;
} //测试代码
public static void main(String[] args) {
ListNode a1 = new ListNode(1);
a1.next = new ListNode(2);
a1.next.next = new ListNode(3);
a1.next.next.next = new ListNode(100); ListNode b1 = new ListNode(1);
b1.next = new ListNode(2);
b1.next.next = new ListNode(3); ListNode c1 = new ListNode(2);
c1.next = new ListNode(3);
c1.next.next = new ListNode(5); ListNode[] arr = {a1, b1, c1}; ListNode res = merge(arr);
while (res!= null) {
System.out.print(res.val + " ");
res = res.next;
}
}
}

合并K个有序数组(链表)【字节跳动面试算法题】的更多相关文章

  1. 合并k个有序数组

    给定K个有序数组,每个数组有n个元素,想把这些数组合并成一个有序数组 可以利用最小堆完成,时间复杂度是O(nklogk),具体过程如下: 创建一个大小为n*k的数组保存最后的结果创建一个大小为k的最小 ...

  2. 合并K个有序数组-Java

    package com.rao.algorithm; import java.util.Arrays; /** * @author Srao * @className MergeK * @date 2 ...

  3. 【leetcode-88,21】 合并两个有序数组/链表

    合并两个有序数组 (easy,1过) 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nu ...

  4. Merge k Sorted Arrays【合并k个有序数组】【优先队列】

    Given k sorted integer arrays, merge them into one sorted array. Example Given 3 sorted arrays: [ [1 ...

  5. leetcode:Reverse Nodes in k-Group(以k为循环节反转链表)【面试算法题】

    题目: Given a linked list, reverse the nodes of a linked list k at a time and return its modified list ...

  6. [LeetCode] Merge k Sorted Lists 合并k个有序链表

    Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 这 ...

  7. leetcode python 012 hard 合并k个有序链表

    #[LeetCode] Merge k Sorted Lists 合并k个有序链表(升序) import numpy as npimport time class Node(object):    d ...

  8. 023 Merge k Sorted Lists 合并K个有序链表

    合并K个有序链表,并且作为一个有序链表的形式返回.分析并描述它的复杂度. 详见:https://leetcode.com/problems/merge-k-sorted-lists/descripti ...

  9. [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 ...

随机推荐

  1. C# 消息队列-Microsoft Azure service bus 服务总线

    先决条件 Visual Studio 2015或更高版本.本教程中的示例使用Visual Studio 2015. Azure订阅. 注意 要完成本教程,您需要一个Azure帐户.您可以激活MSDN订 ...

  2. 前端入门17-JavaScript进阶之作用域

    声明 本系列文章内容全部梳理自以下几个来源: <JavaScript权威指南> MDN web docs Github:smyhvae/web Github:goddyZhao/Trans ...

  3. 小tips:JS之for in、Object.keys()和Object.getOwnPropertyNames()的区别

    for..in循环 使用for..in循环时,返回的是所有能够通过对象访问的.可枚举的属性,既包括存在于实例中的属性,也包括存在于原型中的实例.这里需要注意的是使用for-in返回的属性因各个浏览器厂 ...

  4. Kubernetes Dashboard - 每天5分钟玩转 Docker 容器技术(173)

    前面章节 Kubernetes 所有的操作我们都是通过命令行工具 kubectl 完成的.为了提供更丰富的用户体验,Kubernetes 还开发了一个基于 Web 的 Dashboard,用户可以用 ...

  5. 云服务器挂载/dev/vdb1磁盘

    1.首先检查是否有一块硬盘还未被挂载 2.如图所示,vdb还未被使用,开始分配它吧 [root@localhost ~]# fdisk /dev/vdb Command (m for help): n ...

  6. 【转贴】一次 JDBC 与 MySQL 因 “CST” 时区协商误解导致时间差了 14 或 13 小时的排错经历

    原文:https://juejin.im/post/5902e087da2f60005df05c3d ------------------------------------------------- ...

  7. c/c++ linux epoll系列1 创建epoll

    linux epoll系列1 创建epoll 据说select和poll的弱点是,随着连接(socket)的增加,性能会直线下降. epoll不会随着连接(socket)的增加,性能直线下降. 知识点 ...

  8. windows 为qt5.7.1 安装openssl

    本人使用qt5.7.1+msvc2015写一个https的客户端程序,但是用到解析https协议时,报出如下错误 qt.network.ssl: QSslSocket: cannot call unr ...

  9. 一个数据源demo

    前言 我们重复造轮子,不是为了证明我们比那些造轮子的人牛逼,而是明白那些造轮子的人有多牛逼. JDBC介绍 在JDBC中,我们可以通过DriverManager.getConnection()创建(而 ...

  10. 周末班:Python基础之面向对象进阶

    面向对象进阶 类型判断 issubclass 首先,我们先看issubclass() 这个内置函数可以帮我们判断x类是否是y类型的子类. class Base: pass class Foo(Base ...