题目链接: https://leetcode-cn.com/problems/merge-k-sorted-lists/

题目描述:

合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。

示例:

  1. 输入:
  2. [
  3. 1->4->5,
  4. 1->3->4,
  5. 2->6
  6. ]
  7. 输出: 1->1->2->3->4->4->5->6

思路:

思路1:

优先级队列

时间复杂度:\(O(n*log(k))\),n是所有链表中元素的总和,k是链表个数.

思路2:

分而治之

链表两两合并


关注我的知乎专栏,了解更多解题技巧,我们一起来刷题,共同进步!

代码:

思路1:

python

  1. # Definition for singly-linked list.
  2. # class ListNode:
  3. # def __init__(self, x):
  4. # self.val = x
  5. # self.next = None
  6. class Solution:
  7. def mergeKLists(self, lists: List[ListNode]) -> ListNode:
  8. import heapq
  9. dummy = ListNode(0)
  10. p = dummy
  11. head = []
  12. for i in range(len(lists)):
  13. if lists[i] :
  14. heapq.heappush(head, (lists[i].val, i))
  15. lists[i] = lists[i].next
  16. while head:
  17. val, idx = heapq.heappop(head)
  18. p.next = ListNode(val)
  19. p = p.next
  20. if lists[idx]:
  21. heapq.heappush(head, (lists[idx].val, idx))
  22. lists[idx] = lists[idx].next
  23. return dummy.next

java

  1. /**
  2. * Definition for singly-linked list.
  3. * public class ListNode {
  4. * int val;
  5. * ListNode next;
  6. * ListNode(int x) { val = x; }
  7. * }
  8. */
  9. class Solution {
  10. public ListNode mergeKLists(ListNode[] lists) {
  11. if (lists == null || lists.length == 0) return null;
  12. PriorityQueue<ListNode> queue = new PriorityQueue<>(lists.length, new Comparator<ListNode>() {
  13. @Override
  14. public int compare(ListNode o1, ListNode o2) {
  15. if (o1.val < o2.val) return -1;
  16. else if (o1.val == o2.val) return 0;
  17. else return 1;
  18. }
  19. });
  20. ListNode dummy = new ListNode(0);
  21. ListNode p = dummy;
  22. for (ListNode node : lists) {
  23. if (node != null) queue.add(node);
  24. }
  25. while (!queue.isEmpty()) {
  26. p.next = queue.poll();
  27. p = p.next;
  28. if (p.next != null) queue.add(p.next);
  29. }
  30. return dummy.next;
  31. }
  32. }

思路2:

分而治之

python

  1. # Definition for singly-linked list.
  2. # class ListNode:
  3. # def __init__(self, x):
  4. # self.val = x
  5. # self.next = None
  6. class Solution:
  7. def mergeKLists(self, lists: List[ListNode]) -> ListNode:
  8. if not lists:return
  9. n = len(lists)
  10. return self.merge(lists, 0, n-1)
  11. def merge(self,lists, left, right):
  12. if left == right:
  13. return lists[left]
  14. mid = left + (right - left) // 2
  15. l1 = self.merge(lists, left, mid)
  16. l2 = self.merge(lists, mid+1, right)
  17. return self.mergeTwoLists(l1, l2)
  18. def mergeTwoLists(self,l1, l2):
  19. if not l1:return l2
  20. if not l2:return l1
  21. if l1.val < l2.val:
  22. l1.next = self.mergeTwoLists(l1.next, l2)
  23. return l1
  24. else:
  25. l2.next = self.mergeTwoLists(l1, l2.next)
  26. return l2

java

  1. /**
  2. * Definition for singly-linked list.
  3. * public class ListNode {
  4. * int val;
  5. * ListNode next;
  6. * ListNode(int x) { val = x; }
  7. * }
  8. */
  9. class Solution {
  10. public ListNode mergeKLists(ListNode[] lists) {
  11. if (lists == null || lists.length == 0) return null;
  12. return merge(lists, 0, lists.length - 1);
  13. }
  14. private ListNode merge(ListNode[] lists, int left, int right) {
  15. if (left == right) return lists[left];
  16. int mid = left + (right - left) / 2;
  17. ListNode l1 = merge(lists, left, mid);
  18. ListNode l2 = merge(lists, mid + 1, right);
  19. return mergeTwoLists(l1, l2);
  20. }
  21. private ListNode mergeTwoLists(ListNode l1, ListNode l2) {
  22. if (l1 == null) return l2;
  23. if (l2 == null) return l1;
  24. if (l1.val < l2.val) {
  25. l1.next = mergeTwoLists(l1.next, l2);
  26. return l1;
  27. } else {
  28. l2.next = mergeTwoLists(l1,l2.next);
  29. return l2;
  30. }
  31. }
  32. }

[LeetCode] 23. 合并K个排序链表的更多相关文章

  1. LeetCode 23. 合并K个排序链表(Merge Two Sorted Lists)

    23. 合并K个排序链表 23. Merge k Sorted Lists 题目描述 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. LeetCode23. Merge k S ...

  2. Java实现 LeetCode 23 合并K个排序链表

    23. 合并K个排序链表 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输 ...

  3. [LeetCode]23. 合并K个排序链表(优先队列;分治待做)

    题目 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [   1->4->5,   1->3->4,   2->6 ] 输出: 1 ...

  4. leetcode 23. 合并K个排序链表 JAVA

    题目: 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [   1->4->5,   1->3->4,   2->6 ] 输出: ...

  5. LeetCode 23. 合并K个排序链表(Merge k Sorted Lists)

    题目描述 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [   1->4->5,   1->3->4,   2->6 ] 输出: ...

  6. LeetCode 23 ——合并 K 个排序链表

    1. 题目 2. 解答 2.1. 方法一 在 合并两个有序链表 的基础上,我们很容易想到第一种解法,首先我们将第一个链表和第二个链表合并成一个新的链表,然后再往后依次合并接下来的每个链表即可. 假设每 ...

  7. 【LeetCode】23.合并K个排序链表

    题目描述 23.合并K个排序链表 合并k个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] ...

  8. LeetCode题解-23 合并K个排序链表 Hard

    合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1-&g ...

  9. Leetcode题库——23.合并k个排序链表

    @author: ZZQ @software: PyCharm @file: mergeKLists.py @time: 2018/10/12 19:55 说明:合并 k 个排序链表,返回合并后的排序 ...

随机推荐

  1. CSS揭秘—灵活的背景图(三)

    前言: 所有实例均来自<CSS揭秘>,该书以平时遇到的疑难杂症为引,提供解决方法,只能说秒极了,再一次刷新了我对CSS的认知 该书只提供了关键CSS代码,虽然有在线示例代码链接,但访问速度 ...

  2. python进程和线程(四)

    线程同步条件.信号量及队列 同步条件(event) 下面是官方文档对event的一些解释: An event is a simple synchronization object; the event ...

  3. Python爬虫入门教程 51-100 Python3爬虫通过m3u8文件下载ts视频-Python爬虫6操作

    什么是m3u8文件 M3U8文件是指UTF-8编码格式的M3U文件. M3U文件是记录了一个索引纯文本文件, 打开它时播放软件并不是播放它,而是根据它的索引找到对应的音视频文件的网络地址进行在线播放. ...

  4. 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之六 || API项目整体搭建 6.1 仓储模式

    前言 1.@LearningCoding 小伙伴关于用Sqlsugar在mysql数据库上的研究成果: sqlsugarcore支持mysql等数据库,在DbContext里面只需要设置dbtype为 ...

  5. 【机器学习】--鲁棒性调优之L1正则,L2正则

    一.前述 鲁棒性调优就是让模型有更好的泛化能力和推广力. 二.具体原理 1.背景 第一个更好,因为当把测试集带入到这个模型里去.如果测试集本来是100,带入的时候变成101,则第二个模型结果偏差很大, ...

  6. 安装window下的redis,redis可视化管理工具(Redis Desktop Manager)安装,基础使用,实例化项目

    以下包括内容: 一.redis下载安装,启动 二.Redis可视化管理工具(Redis Desktop Manager)安装 三.实例化项目 一.redis下载安装,启动 1,redis官方下载地址: ...

  7. Nodejs+Express 搭建 web应用

    简单的记录下关于如何使用nodejs+Express 极速搭建一个web应用. 项目所需,要用到nodejs,那就去学咯.简单的看了下 七天学会NodeJS,Node.js 教程.发现其实好简单的,分 ...

  8. 【反编译系列】二、反编译代码(jeb)

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 一般情况下我们都是使用dex2jar + jd-gui的方式反编译代码,在实际使用过程中,有时候发现反编译出来的代码阅读效果不是很好 ...

  9. Python命令行参数解析模块argparse

    当写一个Python脚本时经常会遇到不同参数不同功能的情况,如何做一个更好看的命令帮助信息以及对命令参数解析呢? 这就需要使用argparse模块 #!/usr/bin/env python # -* ...

  10. pwnable.tw dubblesort 分析

    本系列为用于记录那些比较有意思的题目. 题目为一个排序算法,就如题目名称那样,dubblesort,32位程序. 利用思路为栈溢出,先是栈溢出泄露出栈上libc的相关数据从而获取libc地址,再是栈溢 ...