23. 合并K个升序链表

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。

 

示例 1:

输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
解释:链表数组如下:
[
1->4->5,
1->3->4,
2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6
示例 2:

输入:lists = []
输出:[]
示例 3:

输入:lists = [[]]
输出:[]
 

提示:

k == lists.length
0 <= k <= 10^4
0 <= lists[i].length <= 500
-10^4 <= lists[i][j] <= 10^4
lists[i] 按 升序 排列
lists[i].length 的总和不超过 10^4

 

# 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:
        n=len(lists)
        
        #pre-operation
        if n==0:return None
        if n==1:return lists[0]
        if n==2:return self.mergeTwoLists(lists[0],lists[1])
        
        #divid and conquer
        mid=n//2
        return self.mergeTwoLists(self.mergeKLists(lists[:mid]),self.mergeKLists(lists[mid:n]))

    def mergeTwoLists(self,l1:ListNode,l2:ListNode)->ListNode:
        res=ListNode(0)
        q1,q2,q3=l1,l2,res
        while q1 or q2:
            if q1 and q2:
                if q1.val<q2.val:
                    q3.next=ListNode(q1.val)
                    q1=q1.next
                else:
                    q3.next=ListNode(q2.val)
                    q2=q2.next
                q3=q3.next
            elif q1:
                q3.next=q1
                break
            else:
                q3.next=q2
                break
            
        return res.next

 

posted @ 2020-09-24 19:10  XXXSANS  阅读(138)  评论(0编辑  收藏  举报