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

相关推荐
续亮~33 分钟前
6、Redis系统-数据结构-05-整数
java·前端·数据结构·redis·算法
逆水寻舟4 小时前
算法学习记录2
python·学习·算法
羞儿4 小时前
【读点论文】基于二维伽马函数的光照不均匀图像自适应校正算法
人工智能·算法·计算机视觉
青衫酒1455 小时前
中国剩余定理
算法
鸽鸽程序猿5 小时前
【数据结构】顺序表
java·开发语言·数据结构·学习·算法·intellij idea
Chris-zz5 小时前
C++:继承
开发语言·c++·算法·学习方法
硕风和炜5 小时前
【LeetCode:3033. 修改矩阵 + 模拟】
java·算法·leetcode·矩阵·模拟
取加若则_6 小时前
C++入门(C语言过渡)
c语言·开发语言·数据结构·c++·算法
真果粒wrdms6 小时前
【在线词典】项目实现
linux·c语言·嵌入式硬件·算法·udp·sqlite3
YangZheng@6 小时前
23种设计模式
c++·算法·设计模式