LeetCode-23-合并K个升序链表

在这里插入图片描述

1、归并

这道题的前置题目是LeetCode-21-合并两个有序链表,在完成了前置题目的基础上,我们可以用到先前的结果来实现k个链表的排序,其中最方便的方法就是对k个链表进行归并排序,这样每次是两个链表进行两两排序,就能大大简化我们的设计实现。

在进行归并排序时,我们需要注意归并的特殊情况:1、由于我们使用下标规定归并的对象,因此我们在进行归并排序时需要考虑最小的子结果,即两个下标相同的情况,此时我们不需要进行排序只要返回链表指针即可;2、在上一种情况的前提下,此时我们返回了两个链表指针,此时我们只需要对这两个链表进行排序即可,这时我们就可以使用先前的结果从而方便设计。

class Solution {
public:
    ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) {
        ListNode *dummy = new ListNode(0);
        ListNode *cur = dummy;
        while (l1 != nullptr && l2 != nullptr) {
            ListNode **pp = (l1->val < l2->val) ? &l1 : &l2;
            cur->next = *pp;
            cur = cur->next;
            *pp = (*pp)->next;
        }
        cur->next = (l1 == nullptr) ? l2 : l1;

        ListNode *ans = dummy->next;
        delete dummy;
        return ans;
    }

    ListNode *merge(vector<ListNode *> lists, int start, int end) {
        if (start == end) {
            return lists[start];
        }
        int mid = (start + end) / 2;
        ListNode *l1 = merge(lists, start, mid);
        ListNode *l2 = merge(lists, mid + 1, end);
        return mergeTwoLists(l1,l2);
    }


    ListNode *mergeKLists(vector<ListNode *> &lists) {
        if (lists.size() == 0) {
            return nullptr;
        }
        ListNode* result = merge(lists, 0, lists.size() - 1);
        return result;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值