NO23. 合并K个升序链表

复制代码
#能不动脑子咱就不动,暴力解法
#将链表元素放置数组中
#进行排序
#生成新链表
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:
        res = [] #空列表,放置数组
        ans = ListNode() #设置虚拟节点
        ans.next = None
        for link in lists: #将每个数字加入到ListNode
            while link:
                res.append(link.val)
                link = link.next #注意,此对象为ListNode,需要使用link.next进行遍历
        res = sorted(res, reverse = True) # 排序,reverse代表从小到大排序
        if len(res) > 0:
            ans.val = res[0] #设置头节点
            for i in range(1, len(res)):
                tmp = ListNode() #临时节点
                tmp.val = res[i] #赋值
                tmp.next = ans #链接
                ans = tmp #ans指向tmp,重新来过
            return ans #返回ans链表
        else:
            return None
复制代码

 

复制代码
#俩俩合并,21 pro max
class Solution:
    def mergeKLists(self, lists: List[ListNode]) -> ListNode: # 合并k项,利用函数+for循环
        if not lists: return None
        res = None #设置初始结果为空
        for listi in lists: #逐个遍历 两两合并
            res = self.mergeTwoLists(res, listi)
        return res
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode: #上一题的解法
        dummy = ListNode(0) #构造虚节点
        move = dummy #设置移动节点等于虚节点
        while l1 and l2: #都不空时
            if l1.val < l2.val:
                move.next = l1 #移动节点指向数小的链表
                l1 = l1.next
            else:
                move.next = l2
                l2 = l2.next
            move = move.next
        move.next = l1 if l1 else l2 #连接后续非空链表
        return dummy.next #虚节点仍在开头
复制代码
复制代码
#堆:利用堆的数据结构,可以极大地简化代码
class Solution:
    def mergeKLists(self, lists: List[ListNode]) -> ListNode:
        import heapq #调用堆
        minHeap = [] #最小堆
        for listi in lists: 
            while listi:
                heapq.heappush(minHeap, listi.val) #把listi中的数据逐个加到堆中
                listi = listi.next
        dummy = ListNode(0) #构造虚节点
        p = dummy
        while minHeap:
            p.next = ListNode(heapq.heappop(minHeap)) #依次弹出最小堆的数据
            p = p.next
        return dummy.next 
复制代码

 

 
posted @   是冰美式诶  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示