合并k个有序链表 python_leetcode关于合并有序链表的解法 python

题目1

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的.

示例:

输入:1->2->4, 1->3->4

输出:1->1->2->3->4->4

在判断l1和l2是否为空的情况,我先写的代码是if not l1,但是提交后显示运行时间太长,然后网上查了查not 和is None的区别,我猜想if l1 is None运行时间短是因为python把他当成Nontype型数据来处理,而if not l1是判断了l1是否为空列表、空字符、None、False等类型,所以运行时间相对较长,纯属笔者个人观点,有知道为啥的可以在评论区给出,感谢感谢!

具体代码如下:

# Definition for singly-linked list.

# class ListNode:

# def __init__(self, x):

# self.val = x

# self.next = None

class Solution:

def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:

if l1 is None:

return l2

elif l2 is None:

return l1

elif l1.val <= l2.val:

l1.next = self.mergeTwoLists(l1.next,l2)

return l1

else:

l2.next = self.mergeTwoLists(l1,l2.next)

return l2

题目2:

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

示例:

输入:

[

1->4->5,

1->3->4,

2->6

]

输出: 1->1->2->3->4->4->5->6

方法一:

逐一两两合并链表

将合并 k 个链表的问题转化成合并 2 个链表 k-1次。但是这个思路超出了时间限制,因为逐一合并假如你把列表里的链表[0]和链表[1]合并成新的链表后,再和列表里的链表[2]合并,这样循环下去,相当于链表[0]合并了n-1次,造成时间复杂度特别高。

具体的时间复杂度为:

方法二:分治

具体代码如下:

# Definition for singly-linked list.

# class ListNode:

# def __init__(self, x):

# self.val = x

# self.next = None

class Solution:

def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:

if l1 is None:

return l2

elif l2 is None:

return l1

elif l1.val <= l2.val:

l1.next = self.mergeTwoLists(l1.next,l2)

return l1

else:

l2.next = self.mergeTwoLists(l1,l2.next)

return l2

def mergeKLists(self, lists: List[ListNode]) -> ListNode:

interval = 1

count = len(lists)

while interval

for i in range(0,count-interval,interval*2):

lists[i] = self.mergeTwoLists(lists[i] , lists[i + interval])

interval = interval * 2

return lists[0] if count>0 else None

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值