题目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