leetcode 困难 —— 合并K个升序链表(超详细思路)

文章描述了一种解决合并多个已排序链表的问题的方法,通过使用ddd数组记录每个值出现的次数,避免了排序操作,实现了线性时间复杂度的解决方案。首先遍历所有链表更新ddd数组,然后再次遍历ddd数组构建最终的升序链表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。

题解:
这道题真的是简单
看一眼数据范围

首先 lists[i].length 的总和不超过 10^4,这说明,我们可以把每个 list 中的所有元素放进优先队列里,然后依次取出,但是呢,这个是 nlogn,还是慢了

再看一眼,-10^4 <= lists[i][j] <= 10^4,直接 ddd[20000],然后就不需要排序了,ddd[i] 的值,等于所有 list 中等于 i 值的元素个数,这样把所有 list 遍历一遍,给 ddd 数组赋值,最后再遍历一遍 ddd 数组,创建保存结果的链表,没了

代码如下:

class Solution {
public:
    int ddd[20005];
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        for(int i = 0; i < lists.size(); i++) {
            ListNode* temp = lists[i];
            while(temp != NULL) {
                ddd[(temp -> val) + 10000]++;
                temp = temp -> next;
            }
        }
        ListNode* res = new ListNode();
        ListNode* temp = res;
        for(int i = 0; i <= 20000; i++) {
            while(ddd[i] != 0) {
                temp -> next = new ListNode(i - 10000);
                temp = temp -> next;
                ddd[i]--;
            }
        }
        return res -> next;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值