- 题目描述
合并 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:
nums = []
#将Lists的所有节点存入nums数组中
for ls in lists:
h = ls
while h :
nums.append(h.val)
h = h.next
#对数组进行排序
nums.sort()
n = len(nums)
if n == 0:
return
#将数组重新转化为链表输出
temp = ListNode(nums[0])
ans = temp
for i in range(1,n):
temp.next = ListNode(nums[i])
temp = temp.next
return ans
- 思路二
参照官方题解,分治思想,将list两两合并,引入interval变量表示当前要合并的两个list的索引之差。每次循环之后,interval的值会变大,这是因为在合并两个list时,会把前一个list的索引下标作为合并后的list下标,而不会形成新的索引。
- 代码二
# 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:
amount = len(lists)
interval = 1
while interval < amount:
for i in range(0,amount-interval,interval*2):
lists[i] = self.merge2Lists(lists[i],lists[i+interval])
interval *= 2
return lists[0] if amount > 0 else None
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
l2 = l2.next
point = point.next
if not l1:
point.next = l2
else:
point.next = l1
return head.next