自学内容网 自学内容网

LeetCode23. 合并 K 个升序链表(2024秋季每日一题 36)

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

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

示例 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 = = l i s t s . l e n g t h k == lists.length k==lists.length
0 < = k < = 1 0 4 0 <= k <= 10^4 0<=k<=104
0 < = l i s t s [ i ] . l e n g t h < = 500 0 <= lists[i].length <= 500 0<=lists[i].length<=500
− 1 0 4 < = l i s t s [ i ] [ j ] < = 1 0 4 -10^4 <= lists[i][j] <= 10^4 104<=lists[i][j]<=104
l i s t s [ i ] lists[i] lists[i] 按 升序 排列
l i s t s [ i ] . l e n g t h lists[i].length lists[i].length 的总和不超过 1 0 4 10^4 104


解法一:
暴力扫描

  • 每次都扫描每个链表头部
  • 找到最小的节点,加入到新链表中
  • 重复上述过程,直到所有节点都已加入新链表

时间复杂度: O ( K N ) O(KN) O(KN)
空间复杂度: O ( 1 ) O(1) O(1)

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        ListNode* h = nullptr, * cur = nullptr;
        int n = lists.size();
        while(true){
            int head = -1;
            for(int i = 0; i < n; i++){
                if(lists[i] != nullptr){
                    if(head == -1) head = i;
                    else if(lists[head] -> val > lists[i] -> val){
                        head = i;
                    }
                }
            }
            if(head == -1) break;
            if(h == nullptr){
                h = lists[head];
                cur = h;
            }else{
                cur -> next = lists[head];
                cur = cur -> next;
            }
            lists[head] = lists[head] -> next;
        }
        return h;
    }
};

解法二:优先队列优化

时间复杂度: O ( N l o g ( K ) ) O(Nlog(K)) O(Nlog(K))
空间复杂度: O ( K ) O(K) O(K)

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        ListNode* h = nullptr, * cur = nullptr;
        priority_queue<pair<int, ListNode*>, vector<pair<int, ListNode*>>, greater<pair<int, ListNode*>>> q;
        for(auto p: lists){
            if(p != nullptr)
                q.push({p->val, p});
        }
        while(!q.empty()){
            auto t = q.top();
            q.pop();
            if(h == nullptr){
                h = t.second;
                cur = h;
            }else{
                cur -> next = t.second;
                cur = cur -> next;
            }
            ListNode* ne = t.second -> next;
            if(ne != nullptr) q.push({ne -> val, ne});
        }
        return h;
    }
};

原文地址:https://blog.csdn.net/qq_46456049/article/details/142880479

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!