1. 题目
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-k-sorted-lists
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题思路
归并排序,只是数组换成链表了而已。
代码
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def mergeTwoList(self, node1, node2):
merge = ListNode(0)
dummy = merge
while node1 and node2:
tmp = ListNode()
if node1.val > node2.val:
tmp.val = node2.val
merge.next = tmp
merge = merge.next
node2 = node2.next
else:
tmp.val = node1.val
merge.next = tmp
merge = merge.next
node1 = node1.next
if node1:
merge.next = node1
if node2:
merge.next = node2
return dummy.next
def mergeKLists(self, lists: List[ListNode]) -> ListNode:
if len(lists) == 2:
return self.mergeTwoList(lists[0],lists[1])
elif len(lists) == 1:
return lists[0]
elif len(lists) == 0:
return None
left = self.mergeKLists(lists[:len(lists)//2])
right = self.mergeKLists(lists[len(lists)//2:])
return self.mergeTwoList(left,right)
假设链表最大长度为 N,则时间复杂度 O ( N l o g K ) O(NlogK) O(NlogK), 空间复杂度 O ( l o g K ) O(logK) O(logK).