LeetCode 0023. 合并 K 个升序链表

【LetMeFly】23.合并 K 个升序链表

力扣题目链接:https://leetcode.cn/problems/merge-k-sorted-lists/

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

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

示例 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

方法一:优先队列

我们只需要将每个链表的 当前节点(初始值是表头) 放入小根堆中,每次从小根堆中取出一个节点并拼接起来,若这个节点不是表尾节点,则这个节点的下一个节点入队。

  • 时间复杂度 O ( N × log ⁡ k ) O(N\times \log k) O(N×logk),其中 n n n是所有节点的个数
  • 空间复杂度 O ( k ) O(k) O(k)

AC代码

C++

cpp 复制代码
class Solution {
private:
    struct cmp {
        bool operator() (const ListNode* a, const ListNode* b) {
            return a->val > b->val;
        }
    };
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        priority_queue<ListNode*, vector<ListNode*>, cmp> pq;
        for (ListNode*& node : lists) {
            if (node) {
                pq.push(node);
            }
        }
        ListNode* head = new ListNode(), *p = head;
        while (pq.size()) {
            ListNode* thisNode = pq.top();
            pq.pop();
            p->next = thisNode;
            p = thisNode;
            if (thisNode->next) {
                pq.push(thisNode->next);
            }
        }
        return head->next;
    }
};

Python

python 复制代码
# from typing import List, Optional
# import heapq

# # Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next

# ListNode.__lt__ = lambda a, b: a.val < b.val

class Solution:
    def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:
        pq = []
        for node in lists:
            if node:
                heapq.heappush(pq, node)
        head = ListNode()
        p = head
        while pq:
            thisNode = heapq.heappop(pq)
            p.next = thisNode
            p = thisNode
            if thisNode.next:
                heapq.heappush(pq, thisNode.next)
        return head.next

同步发文于CSDN,原创不易,转载请附上原文链接哦~

Tisfy:https://letmefly.blog.csdn.net/article/details/132243952

相关推荐
山烛1 小时前
决策树学习全解析:从理论到实战
人工智能·python·学习·算法·决策树·机器学习
修己xj2 小时前
探索设计模式的宝库:Java-Design-Patterns
算法
鲨鱼辣椒_TUT2 小时前
MySQL连接算法和小表驱动大表的原理
mysql·算法·adb
设计师小聂!2 小时前
力扣热题100------21.合并两个有序链表
算法·leetcode·链表
এ᭄画画的北北3 小时前
力扣-1.两数之和
数据结构·算法·leetcode
shenghaide_jiahu3 小时前
数学建模——递归和动态规划
算法·数学建模·动态规划
凯子坚持 c4 小时前
动态规划专题:详解二维费用背包问题——以“一和零”与“盈利计划”为例
算法·动态规划
黑色的山岗在沉睡4 小时前
P1948 [USACO08JAN] Telephone Lines S
数据结构·c++·算法·图论
CUC-MenG4 小时前
2025牛客多校第五场 K.完美旅程 J.最快覆盖问题 E.神秘异或操作 个人题解
数学·dfs·bfs·优先队列·二分·位运算·fmt·曼哈顿距离·fwt