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

相关推荐
信奥洪老师几秒前
2025-03 机器人等级考试三级理论真题 3级
算法·青少年编程·机器人·arduino
古月฿21 分钟前
流水线问题(算法设计)C++
开发语言·c++·算法
m0_631354451 小时前
2024武汉邀请赛B.Countless Me
算法
Evand J1 小时前
课题推荐——通信信号处理中的非线性系统状态估计(如信号跟踪、相位恢复等场景),使用无迹卡尔曼滤波(UKF)的非线性滤波算法,MATLAB实现
算法·matlab·信号处理
yy鹈鹕灌顶1 小时前
贪心算法精解(Java实现):从理论到实战
java·算法·贪心算法
结冰架构2 小时前
【AI提示词】决策树专家
人工智能·算法·决策树·ai·提示词
啊阿狸不会拉杆2 小时前
人工智能数学基础(五):概率论
人工智能·python·数学·算法·概率论
阳洞洞2 小时前
leetcode 977. Squares of a Sorted Array
算法·leetcode·双指针
羑悻的小杀马特4 小时前
从工厂到生活:算法 × 深度学习,正在改写自动化的底层逻辑
深度学习·算法·自动化·生活
翀哥~4 小时前
奇偶ASCII值判断
c++·算法·ascii