# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param lists ListNode类一维数组 
# @return ListNode类
#
'''
class Solution:

    # 合并两个链表
    def Merge2(self,head1:ListNode,head2:ListNode)->ListNode:
        if not head1 or not head2:
            return head2 or head1
        if head1.val>head2.val:  
            head2.next=self.Merge2(head1,head2.next)
            return head2
        else:
            head1.next=self.Merge2(head1.next,head2)
            return head1

    # 划分合并区间函数
    def divideMerge(self,lists:List[ListNode],left:int,right:int) -> ListNode:
        if left>right:
            return None
        elif left==right:
            return lists[left]
        mid=int((left+right)/2)
        return self.Merge2(self.divideMerge(lists,left,mid),self.divideMerge(lists,mid+1,right))

    def mergeKLists(self , lists: List[ListNode]) -> ListNode:
        # write code here
        return self.divideMerge(lists,0,len(lists)-1)
'''
import sys
#设置递归深度
sys.setrecursionlimit(100000) 

class Solution:
    #两个有序链表合并函数
    def Merge2(self, pHead1: ListNode, pHead2: ListNode) -> ListNode: 
        #一个已经为空了,直接返回另一个
        if pHead1 == None: 
            return pHead2
        if pHead2 == None:
            return pHead1
        #加一个表头
        head = ListNode(0) 
        cur = head
        #两个链表都要不为空
        while pHead1 and pHead2: 
            #取较小值的节点
            if pHead1.val <= pHead2.val: 
                cur.next = pHead1
                #只移动取值的指针
                pHead1 = pHead1.next 
            else:
                cur.next = pHead2
                #只移动取值的指针
                pHead2 = pHead2.next 
            #指针后移
            cur = cur.next 
        #哪个链表还有剩,直接连在后面
        if pHead1: 
            cur.next = pHead1
        else:
            cur.next = pHead2
        #返回值去掉表头
        return head.next 
    
    #划分合并区间函数
    def divideMerge(self, lists: List[ListNode], left: int, right: int) -> ListNode:         
        if left > right :
            return None
        #中间一个的情况
        elif left == right: 
            return lists[left]
        #从中间分成两段,再将合并好的两段合并
        mid = (int)((left + right) / 2) 
        return self.Merge2(self.divideMerge(lists, left, mid), self.divideMerge(lists, mid + 1, right))
    
    def mergeKLists(self , lists: List[ListNode]) -> ListNode:
        #k个链表归并排序
        return self.divideMerge(lists, 0, len(lists) - 1)