一、描述

给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。

示例 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

二、理解

首先,意识到数组中每个元素是一个链表,要注意和列表的区别;其次,每个链表都是升序的,因此两个链表合二为一可以在线性时间内完成。

思路

将前两个链表合二为一,将新链表与第三个链表合二为一,......,将新链表与第n个链表合二为一。

一些特殊情况为

空数组,直接返回,没有返回值,有返回值便通不过,不知是LeetCode的问题还是我理解的有问题;只有一个链表,直接返回链表头。

小技巧

提示中说明了链表元素的最小值是-10000,可提前生成一个值为-10001的链表头,否则你要在两个链表的首元素中选择一个作为链表头。

这也是为何第三部分代码最后一行是 return head.next 而不是 return head 的原因。

三、代码(初级版)

class ListNode(object):

def __init__(self, val=0, next=None):

self.val = val

self.next = next

class Solution(object):

def mergeKLists(self, lists):

"""

:type lists: List[ListNode]

:rtype: ListNode

"""

k = len(lists)

head = ListNode(val=-10001)

tail = head

if k == 0: return

if k == 1: return lists[0]

lp = lists[0]

rp = None

i = 1

# 将已完成合并的链表与当前链表数组中的第i个链表进行合并

while i < k:

rp = lists[i]

while lp and rp:

if lp.val <= rp.val:

tail.next = lp

tail = lp

lp = lp.next

else:

tail.next = rp

tail = rp

rp = rp.next

if rp: tail.next = rp

if lp: tail.next = lp

i += 1

# 如果数组没有遍历完,则重置头指针和尾指针

if i < k:

lp = head.next

head.next = None

tail = head

return head.next

上述代码虽然通过了测试,但下述结果并不是特别理想。

执行用时:3916 ms, 在所有 Python 提交中击败了15.47%的用户

内存消耗:19.1 MB, 在所有 Python 提交中击败了41.84%的用户

算法复杂度为

,n 为所有的链表节点数。

四、优化版

在优化版本中,注意是意识到了可以效仿归并排序的做法,下面是代码。

# Definition for singly-linked list.

class ListNode(object):

def __init__(self, val=0, nxt=None):

self.val = val

self.next = nxt

class Solution(object):

def mergeKLists(self, lists):

"""

:type lists: List[ListNode]

:rtype: ListNode

"""

k = len(lists)

if k == 0: return

if k == 1: return lists[0]

mid = k / 2

lp = self.mergeKLists(lists[0:mid])

rp = self.mergeKLists(lists[mid:])

head = ListNode(val=-10001)

tail = head

while lp and rp:

if lp.val <= rp.val:

tail.next = lp

tail = lp

lp = lp.next

else:

tail.next = rp

tail = rp

rp = rp.next

if lp: tail.next = lp

if rp: tail.next = rp

return head.next

这次的执行结果

执行用时:92 ms, 在所有 Python 提交中击败了73.96% 的用户

内存消耗:18.9 MB, 在所有 Python 提交中击败了43.94% 的用户

算法复杂度为

,n 为所有的链表节点数。

python合并k个有序链表_Leetcode合并K个升序链表(Python版本),LeetCode,python相关推荐

  1. 合并两个有序数组python_合并两个有序数组.py

    # 合并两个有序数组 # 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组. # # 说明: # 初始化 nums1 和 ...

  2. 合并两个有序数组,合并之后保持有序

    /*** * @param a 有序数组a* @param b 有序数组b* @param c 合并之后的有序数组c*/public static void merge(int[] a,int[] b ...

  3. 每隔k次反转一次 链表_leetcode 25 K个一组翻转链表(c++)

    ### 题目 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序. 说 ...

  4. python合并两个有序列表_合并两个有序链表(Python3)

    提出问题:将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1->1-& ...

  5. 合并两个有序数组 java_合并两个有序的数组

    /** * 写在前面,题目要求的是将有序数组合并,那么有可能这所谓的有序是顺序或者逆序 * 所以,应该在开始的时候判断一下 * 然后,在比较的时候应该根据顺序逆序来写判断逻辑 * 不过常规应该是顺序递 ...

  6. 合并两个有序数组python_Python3合并两个有序数组代码实例

    第一种思路,把两个数组合为一个数组然后再排序,问题又回归到冒泡和快排了,没有用到两个数组的有序性.(不好) 第二种思路,循环比较两个有序数组头位元素的大小,并把头元素放到新数组中,从老数组中删掉,直到 ...

  7. 合并两个有序链表分析

    合并两个有序链表: 将两个升序链表合并为一个新的 升序 链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: l1 l2 输入:1->2->4, 1->3->4 ...

  8. python 多个列表合并_Python对两个有序列表进行合并和排序的例子

    Python对两个有序列表进行合并和排序的例子 这篇文章主要介绍了Python对两个有序列表进行合并和排序的例子,最终代码经过不断优化,小编非常满意,需要的朋友可以参考下 假设有2个有序列表l1.l2 ...

  9. leetcode 21 java_LeetCode 21. 合并两个有序链表

    LeetCode 21. 合并两个有序链表 题目 将两个升序链表合并为一个新的升序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1-> ...

最新文章

  1. JavaScript-变量与作用域链
  2. MFC的sendmessage和postmessage 以及sendmessagetimeout
  3. FFmpeg - 音频解码过程
  4. 回溯法采用的搜索策略_数值优化|笔记整理(3)——线搜索中的步长选取方法,线性共轭梯度法...
  5. 在c语言中数据类型高低,C语言的数据类型
  6. windows10怎么锁定计算机,别让Windows 10锁住亲友
  7. imagej边缘提取
  8. 8.2 自制操作系统: risc-v Machine寄存器说明mstatus和mstatush
  9. iphone禁止自动连接wifi操作方法「苹果教程」
  10. java poi 水印_java解决poi导出excel文字水印,导出excel不可操作问题
  11. ocm认证年薪多少_年薪 100 万在 IT 行业中,属于什么水平 ?
  12. 钢琴艺术培训市场现状研究分析报告 -
  13. python 开放端口探测工具
  14. Implicit Neural Representations with Periodic Activation Functions
  15. GSM Channel Mode Modify和Channel Mode Modify Acknowledge信令
  16. android工具类
  17. ConcurrentHashMap源码解读
  18. 十个小贴士!帮你节省编程时间、减少挫败感
  19. 基于NodeJs的爬虫
  20. tommy_guolin JavaFX 2 初探----Eclipse下运行Ensemble程序

热门文章

  1. 安装和使用Oracle VM VirtualBox中的要点,注意事项和遇到的问题
  2. 双重指针作为函数参数的妙用
  3. slub object 内存布局
  4. 换发型app任性扣费?苹果app订阅任性扣费?怎么办?刚成功
  5. Python(27)_字符串的常用的方法2
  6. VC++关于UNICODE版本的开发
  7. 数据结构(十)栈的作用--大数的加法运算
  8. kafka源码分析(二)Metadata的数据结构与读取、更新策略
  9. 一道面试题:js返回函数, 函数名后带多个括号的用法及join()的注意事项
  10. (转)@ContextConfiguration注解说明