LeetCode 23 合并K个排序链表
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
解法一:
思路:先将所有链表的元素遍历一遍,将其数值添加入一个数组当中,在对数组进行排序,使用这个数组构建新的链表
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def mergeKLists(self, lists: List[ListNode]) -> ListNode:
self.Nodes=[]
head = point = ListNode(0)
for list in lists:
while list:
self.Nodes.append(list.val)
list=list.next
for x in sorted(self.Nodes):
point.next=ListNode(x)
point = point.next
return head.next
**解法二:**分而治之
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def mergeKLists(self, lists: List[ListNode]) -> ListNode:
if not lists:
return
n = len(lists)
return self.merge(lists, 0, n-1)
def merge(self,lists, low, high):
if low == high:
return lists[high]
mid = (high + low) // 2
l1 = self.merge(lists, low, mid)
l2 = self.merge(lists, mid+1, high)
return self.merge2Lists(l1, l2)
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=l2.next
point= point.next
if not l1:
point.next= l2
else:
point.next = l1
return head.next