python合并k个有序链表_Leetcode合并K个升序链表(Python版本),LeetCode,python
一、描述
给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。
示例 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相关推荐
- 合并两个有序数组python_合并两个有序数组.py
# 合并两个有序数组 # 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组. # # 说明: # 初始化 nums1 和 ...
- 合并两个有序数组,合并之后保持有序
/*** * @param a 有序数组a* @param b 有序数组b* @param c 合并之后的有序数组c*/public static void merge(int[] a,int[] b ...
- 每隔k次反转一次 链表_leetcode 25 K个一组翻转链表(c++)
### 题目 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序. 说 ...
- python合并两个有序列表_合并两个有序链表(Python3)
提出问题:将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1->1-& ...
- 合并两个有序数组 java_合并两个有序的数组
/** * 写在前面,题目要求的是将有序数组合并,那么有可能这所谓的有序是顺序或者逆序 * 所以,应该在开始的时候判断一下 * 然后,在比较的时候应该根据顺序逆序来写判断逻辑 * 不过常规应该是顺序递 ...
- 合并两个有序数组python_Python3合并两个有序数组代码实例
第一种思路,把两个数组合为一个数组然后再排序,问题又回归到冒泡和快排了,没有用到两个数组的有序性.(不好) 第二种思路,循环比较两个有序数组头位元素的大小,并把头元素放到新数组中,从老数组中删掉,直到 ...
- 合并两个有序链表分析
合并两个有序链表: 将两个升序链表合并为一个新的 升序 链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: l1 l2 输入:1->2->4, 1->3->4 ...
- python 多个列表合并_Python对两个有序列表进行合并和排序的例子
Python对两个有序列表进行合并和排序的例子 这篇文章主要介绍了Python对两个有序列表进行合并和排序的例子,最终代码经过不断优化,小编非常满意,需要的朋友可以参考下 假设有2个有序列表l1.l2 ...
- leetcode 21 java_LeetCode 21. 合并两个有序链表
LeetCode 21. 合并两个有序链表 题目 将两个升序链表合并为一个新的升序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1-> ...
最新文章
- JavaScript-变量与作用域链
- MFC的sendmessage和postmessage 以及sendmessagetimeout
- FFmpeg - 音频解码过程
- 回溯法采用的搜索策略_数值优化|笔记整理(3)——线搜索中的步长选取方法,线性共轭梯度法...
- 在c语言中数据类型高低,C语言的数据类型
- windows10怎么锁定计算机,别让Windows 10锁住亲友
- imagej边缘提取
- 8.2 自制操作系统: risc-v Machine寄存器说明mstatus和mstatush
- iphone禁止自动连接wifi操作方法「苹果教程」
- java poi 水印_java解决poi导出excel文字水印,导出excel不可操作问题
- ocm认证年薪多少_年薪 100 万在 IT 行业中,属于什么水平 ?
- 钢琴艺术培训市场现状研究分析报告 -
- python 开放端口探测工具
- Implicit Neural Representations with Periodic Activation Functions
- GSM Channel Mode Modify和Channel Mode Modify Acknowledge信令
- android工具类
- ConcurrentHashMap源码解读
- 十个小贴士!帮你节省编程时间、减少挫败感
- 基于NodeJs的爬虫
- tommy_guolin JavaFX 2 初探----Eclipse下运行Ensemble程序
热门文章
- 安装和使用Oracle VM VirtualBox中的要点,注意事项和遇到的问题
- 双重指针作为函数参数的妙用
- slub object 内存布局
- 换发型app任性扣费?苹果app订阅任性扣费?怎么办?刚成功
- Python(27)_字符串的常用的方法2
- VC++关于UNICODE版本的开发
- 数据结构(十)栈的作用--大数的加法运算
- kafka源码分析(二)Metadata的数据结构与读取、更新策略
- 一道面试题:js返回函数, 函数名后带多个括号的用法及join()的注意事项
- (转)@ContextConfiguration注解说明