第二周Merge k Sorted Lists

本文深入解析了LeetCode上第23题“合并K个有序链表”的算法实现,采用分治策略将多个有序链表高效合并为一个。详细介绍了算法步骤,包括如何将链表分组、递归排序以及最终合并链表的过程。

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

Merge k Sorted Lists

本周讲的是分治,所以选的题目也是分治的问题
LeetCode上的23题:https://leetcode.com/problems/merge-k-sorted-lists/description/

题目

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

Example:

Input:
[
  1->4->5,
  1->3->4,
  2->6
]
Output: 1->1->2->3->4->4->5->6

题解

分:当要排序的链表大于2时,将链表分成左右两个部分排序,若要排序的链表数为一时,拷贝该链表并返回
治:对两个已排序链表进行排序,返回包含两个链表元素的已排序链表

代码

class Solution {
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        if (lists.size() == 0) return NULL;
        return _mergeKlists(lists, 0, lists.size() - 1);
    }

    ListNode* _mergeKlists(vector<ListNode*>& lists, int left, int right) {
        ListNode* newList = new ListNode(0);
        ListNode* cur = newList;

        if (left == right) {
            ListNode* p = lists[left];
            while (p != NULL) {
                cur->next = new ListNode(p->val);
                p = p->next;
                cur = cur->next;
            }
        }
        else {
            int mid = (left + right) / 2;
            ListNode* l = _mergeKlists(lists, left, mid);
            ListNode* r = _mergeKlists(lists, mid + 1, right);
            while (l != NULL && r != NULL) {
                if (l->val < r->val) {
                    cur->next = l;
                    l = l->next;
                }
                else {
                    cur->next = r;
                    r = r->next;
                }
                cur = cur->next;
            }
            if (l == NULL) {
                cur->next = r;
            }
            else {
                cur->next = l;
            }
        }

        cur = newList->next;
        delete newList;
        return cur;
    }
};

分析

算法将多个排序链表分成两个部分,最后将两个已排序链表合并成一个排序链表,令N为节点总数,k为链表总数。
则算法会经过log2(k)次分治,每次合并链表的时间复杂度为O(N),故总时间为O(log2(k) * N).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值