首先想到的是暴力法,搜索了部分函数,得到结果,发现效率也挺高。
class Solution:
def mergeKLists(self, lists: List[ListNode]) -> ListNode:
self.nodes = []
head = point = ListNode(0)# 设置哨兵节点
for l in lists: # 循环遍历列表中每一个链表,将元素添加进数组。
while l:# 将当前链表中的元素进行添加
self.nodes.append(l.val)
l = l.next
for x in sorted(self.nodes):# 将排序之后的数组中的元素,构造链表。
point.next = ListNode(x)
point = point.next
return head.next
Class Solution(object):
def mergeKLists(self, lists):
"""
:type lists: List[ListNode]
:rtype: ListNode
"""
amount = len(lists) # 计算出K的数值
interval = 1 # 间距
while interval < amount:# 先从间距1开始合并,
for i in range(0, amount - interval, interval * 2):
lists[i] = self.merge2Lists(lists[i], lists[i + interval])# 使用两个链表的合并函数进行合并。
interval *= 2# 当上一次间距合并完之后,将间距扩大为2倍。
return lists[0] if amount > 0 else lists # 当列表链表数大于0时,返回第一个链表(排序好的链表)。
def merge2Lists(self, l1, l2):# 两个链表进行合并成一个链表。
head = point = ListNode(0)# 设置哨兵节点
while l1 and l2:
if l1.val <= l2.val:
point.next = l1
l1 = l1.next
else:
point.next = l2
l2 = l1
l1 = point.next.next
point = point.next
if not l1:# 其中一个链表不为空,就将其添加到后面。
point.next=l2
else:
point.next=l1
return head.next
分治法还是很好理解的,但是在函数实现的过程就没那么容易,搜索函数得到函数实现的功能。