题目

解题
第一眼看到 应该是个多个指针下钻可以解决 但是 多少个指针 不确定 这里要消除 可以很快联想到合并两个链表的算法 子问题清晰的 先合并 前两个 再迭代数组和后面的合并
from typing import *
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
def solution(lists: List[Optional[ListNode]]):
    def merge_two_list(list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
        if list1 is None:
            return list2
        if list2 is None:
            return list1
        f_node:ListNode=ListNode(None)
        dy:ListNode= f_node
        while list1 and list2:
            if list1.val<list2.val:
                dy.next=list1
                list1=list1.next
            else:
                dy.next=list2
                list2=list2.next
            dy=dy.next
        dy.next=list1 and list1 or list2
        return f_node.next
        
    if len(lists) < 1:
        return None
    if len(lists) == 1:
        return lists[0]
    rst_list = merge_two_list(lists[0], lists[1])
    for i in range(2, len(lists)):
        rst_list = merge_two_list(lists[i], rst_list)
    return rst_list
这里合并的重复 次数比较多 可以改进为 氛围左右两部分 先合 并没合并的 最后合并 最后合并 区间函数 这个就是典型的分治法
from typing import *
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
def solution(lists: List[Optional[ListNode]]):
    def merge_two_list(list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
        if list1 is None:
            return list2
        if list2 is None:
            return list1
        f_node: ListNode = ListNode(None)
        dy: ListNode = f_node
        while list1 and list2:
            if list1.val < list2.val:
                dy.next = list1
                list1 = list1.next
            else:
                dy.next = list2
                list2 = list2.next
            dy = dy.next
        dy.next = list1 and list1 or list2
        return f_node.next
    if len(lists) < 1:
        return None
    if len(lists) == 1:
        return lists[0]
    mid = len(lists) // 2
    l1 = solution(lists[:mid])
    l2 = solution(lists[mid:])
    return merge_two_list(l1, l2)
我们也可以 用最小堆,不断动态比较
from typing import *
import heapq
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
    def __lt__(self, other):
        return self.val < other.val
def solution(lists: List[Optional[ListNode]]):
    min_heap=[]
    for l in lists:
        if l:
            heapq.heappush(min_heap, l)
    f_node=ListNode(0)
    dy=f_node
    while min_heap:
        node = heapq.heappop(min_heap)
        dy.next=node
        if node.next:
            heapq.heappush(min_heap,node.next)
        dy=dy.next
    return f_node.next