首页 > 其他分享 >LeetCode-23 合并 K 个升序链表

LeetCode-23 合并 K 个升序链表

时间:2024-01-02 11:35:20浏览次数:25  
标签:pre ListNode cur val next 链表 vec 升序 LeetCode


LeetCode-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

solution

采用分治法,

  1. pre_vec合并两个相邻的链表,并将结果放入vec
  2. pre_vec=vec,vec.clear()
  3. 循环上述操作,直至pre_vec的长度为1
  4. 输出pre_vec[0]
#include <vector>

using namespace std;

//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) {}
};

//leetcode submit region begin(Prohibit modification and deletion)
/**
 * 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 {
private:
    ListNode *mergeLists(ListNode *A, ListNode *B) {
        ListNode *L = new ListNode(), *P_A = A, *P_B = B, *cur = L;
        while (P_A != nullptr && P_B != nullptr) {
            if (P_A->val < P_B->val) {
                ListNode *P = new ListNode(P_A->val);
                cur->next = P;
                cur = cur->next;
                P_A = P_A->next;
            } else {
                ListNode *P = new ListNode(P_B->val);
                cur->next = P;
                cur = cur->next;
                P_B = P_B->next;
            }
        }
        if (P_A!= nullptr) {
            cur->next = P_A;
        }
        if (P_B!= nullptr) {
            cur->next = P_B;
        }
        return L->next;
    }

public:
    ListNode *mergeKLists(vector<ListNode *> &lists) {
        vector<ListNode *> pre_vec = lists;
        vector<ListNode *> vec;
        if (lists.size()==0)
        {
            return nullptr;
        }
        else if (lists.size()==1)
        {
            return lists[0];
        }
        do {
            for (int i = 0; i < pre_vec.size(); i += 2) {
                if (i + 1 < pre_vec.size()) {
                    vec.push_back(mergeLists(pre_vec[i], pre_vec[i + 1]));
                } else {
                    vec.push_back(pre_vec[pre_vec.size() - 1]);
                }
            }
            pre_vec = vec;
            vec.clear();
        } while (pre_vec.size() != 1);
        return pre_vec[0];
    }
};
//leetcode submit region end(Prohibit modification and deletion)

ListNode *createList(int a[], int n) {
    ListNode *A = new ListNode(), *cur = A;
    for (int i = 0; i < n; ++i) {
        ListNode *p = new ListNode(a[i]);
        p->next = NULL;
        cur->next = p;
        cur = cur->next;
    }
    return A->next;
}

int main() {
    int a[3] = {1, 4, 5}, b[3] = {1, 3, 4}, c[2] = {2, 3}, na = 3, nb = 3, nc = 2;
    vector<ListNode *> A = {createList(a, na), createList(b, nb), createList(c, nc)};
    Solution solution;
    solution.mergeKLists(A);

}


标签:pre,ListNode,cur,val,next,链表,vec,升序,LeetCode
From: https://blog.51cto.com/u_14189203/9065755

相关文章

  • 【LeetCode】46. 全排列
    一、题目描述给定一个不含重复数字的数组nums,返回其所有可能的全排列。你可以按任意顺序返回答案。示例1:输入:nums=[1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例2:输入:nums=[0,1]输出:[[0,1],[1,0]]示例3:输入:nums=[1]输出:[[1]]提示:1<=nums.......
  • 【LeetCode】2055. 蜡烛之间的盘子
    一、题目描述给你一个长桌子,桌子上盘子和蜡烛排成一列。给你一个下标从0开始的字符串s,它只包含字符'*'和'|',其中'*'表示一个盘子,'|'表示一支蜡烛。同时给你一个下标从0开始的二维整数数组queries,其中queries[i]=[lefti,righti]表示子字符串s[lefti...rig......
  • 【LeetCode】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......
  • #yyds干货盘点# LeetCode程序员面试金典:赎金信
    给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。如果可以,返回 true ;否则返回 false 。magazine 中的每个字符只能在 ransomNote 中使用一次。 示例1:输入:ransomNote="a",magazine="b"输出:false示例2:输入:ransomNot......
  • #yyds干货盘点# LeetCode程序员面试金典:按权重随机选择
    题目给你一个下标从0开始的正整数数组w,其中w[i]代表第i个下标的权重。请你实现一个函数pickIndex,它可以随机地从范围[0,w.length-1]内(含0和w.length-1)选出并返回一个下标。选取下标i的概率为w[i]/sum(w)。例如,对于w=[1,3],挑选下标0的概率......
  • 代码随想录 小结02 链表
    第一题移除链表元素这题比较简单使用dummyHead的方式会比较简单不需要对头指针进行单独处理但是空间开销会大一些第二题设计链表类这个没什么好说的感觉有可能一些细节会忘记需要经常复习的一块第三题反转链表这题难度不大用一个tmp指针存储一下当前指针的next......
  • leetcode 2.两数相加
    leetcode第二题:两数相加以链表为载体模仿加法进位,同时遍历两个链表,逐位计算它们的和,并与当前位置的进位值相加。如果两个链表的长度不同,则可以认为长度短的链表的后面有若干个0。如果链表遍历结束后,有carry>0,还需要在答案链表的后面附加一个节点,节点的值为carry。易错点:1.......
  • 链表相交问题
    链表链表相交问题思路来源一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到笔记内容问题描述:现有两个单向链表,需要判断两个链表是否相交,若相交,返回链表最开始的交点,若不相交,则返回null算法思路:首先需要判断两个链表是否是环形链表,并获取环形链......
  • day03 代码随想录算法训练营 203. 移除链表元素
    题目:203.移除链表元素我的感悟:题目里的节点是已经给好的,创建虚拟节点,是为了方便处理头节点。加油,我可以的!!!!!理解难点:节点已经给好的创建虚拟节点代码难点:p是临时变量,类似于foriinrange(10)这里的i,本身是用完就扔的。返回值为什么不能是p.next?因为p是一个指针,......
  • 环形链表问题
    链表环形链表问题思路来源一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到笔记内容问题来源:基于力扣141题进行拓展问题描述:给你一个链表的头节点head,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存......