[每日一题][找工作第28天][2025-10-20] Leetcode 23. 合并 K 个升序链表(实现了但不是最优解)

题目

23. 合并 K 个升序链表
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
 
示例 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

我的代码(C++)

/**
 * 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) {
        if (lists.empty()) {
            return nullptr;
        }
        while (lists.size() > 1) {
            int len = lists.size();
            ListNode* dummyHead = new ListNode();
            for (int i = 0; i < len - 1; i += 2) {
                ListNode* tmp1 = lists[i];
                ListNode* tmp2 = lists[i + 1];
                dummyHead->next = nullptr;
                ListNode* tmp = dummyHead;
                while (tmp1 && tmp2) {
                    if (tmp1->val <= tmp2->val) {
                        tmp->next = tmp1;
                        tmp = tmp1;
                        tmp1 = tmp1->next;
                    } else {
                        tmp->next = tmp2;
                        tmp = tmp2;
                        tmp2 = tmp2->next;
                    }
                }
                if (tmp1) {
                    tmp->next = tmp1;
                } else if (tmp2) {
                    tmp->next = tmp2;
                }
                lists[i] = dummyHead->next;
                lists[i + 1] = nullptr;
            }
            for(vector<ListNode*>::iterator it = lists.begin(); it != lists.end();) {
                if (!(*it)) {
                    lists.erase(it);
                } else {
                    it++;
                }
            }
        }
        return lists[0];
    }
};

点评

因为昨天做排序链表,官方的解答中用到了自底向上的归并排序,所以这里也自然想到了这个方法,直接用于实现。
通过算是通过了,不过表现中规中矩。和官方的第一种解法差不多(第一种就不考虑了)。
官方的最后一种方法用到了优先队列,这是我没想到的。因为实际工作中不太常用到,所以不熟悉。
我一开始往stl上想过,想找一个能够快速插入、删除和排序的结构,不过思路一直在往二叉树方向飘,而STL里并没有类似实现,自己实现可能性太低,所以放弃了。
还是要对各种语言的标准库熟悉一些才更好做工程,毕竟自己一个人想算法,怎么也不如做标准库那些大神们(对我来说)。


baddif@gmail.com

AI简历优化站

Nonpareil.me:优化简历,助力职场
开源代码

AI求职跟踪器(建设中)

开源代码

主站(建设中)

Nonpareil Me

相关平台

Github Issues / Notion / Blog

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部