文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

leetcode23. 合并K个排序链表

2023-06-03 09:07

关注

1. 题目描述

合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。示例:输入:[  1->4->5,  1->3->4,  2->6]输出: 1->1->2->3->4->4->5->6来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/merge-k-sorted-lists

2. 解题思路

3. 测试结果

解法一、顺序合并
leetcode23. 合并K个排序链表
解法二、分治合并
leetcode23. 合并K个排序链表

4. 顺序合并

struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {    if (!l1)        return l2;    if (!l2)        return l1;    struct ListNode* head = (struct ListNode*)malloc(sizeof(struct ListNode)), * tail = head;    while (l1 && l2) {        if (l1->val < l2->val) {            tail->next = l1;            l1 = l1->next;        }        else {            tail->next = l2;            l2 = l2->next;        }        tail = tail->next;    }    if (l1) tail->next = l1;    else if (l2) tail->next = l2;    tail = head;    head = head->next;    free(tail);    return head;}struct ListNode* mergeKLists(struct ListNode** lists, int listsSize) {    if (listsSize == 0)        return NULL;    struct ListNode* res = *lists;    for (int i = 1; i < listsSize; i++)    {        if(lists[i] != NULL)            res = mergeTwoLists(res, lists[i]);    }    return res;}

5. 分治合并

struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {    if ((!l1) || (!l2)) return l1 ? l1 : l2;    struct ListNode head;    head.next = NULL;    struct ListNode* tail = &head;    while (l1 && l2) {        if (l1->val < l2->val) {            tail->next = l1;            l1 = l1->next;        }        else {            tail->next = l2;            l2 = l2->next;        }        tail = tail->next;    }    tail->next = l1 ? l1 : l2;    return head.next;}struct ListNode* merge(struct ListNode** lists, int left, int right) {    if (left == right)        return lists[left];    if (left > right)        return NULL;    int mid = (left + right) >> 1;    struct ListNode* p1 = merge(lists, left, mid);    struct ListNode* p2 = merge(lists, mid + 1, right);    return mergeTwoLists(p1, p2);}struct ListNode* mergeKLists(struct ListNode** lists, int listsSize) {    if (listsSize == 0)        return NULL;    return merge(lists, 0, listsSize - 1);}

6. 复杂度分析

解法一、顺序合并
时间复杂度:O(n*n)
空间复杂度:O(1)
解法二、分治合并
时间复杂度:O(nlogn)
空间复杂度:O(1)

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 资料下载
  • 历年真题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯