浅谈归并排序:合并 K 个升序链表的归并解法

在面试中遇到了这道题:如何实现多个升序链表的合并。这是 LeetCode 上的一道原题,题目具体如下:

用归并实现合并 K 个升序链表

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

这题可以用归并的思想来实现,我们两两链表合并,到最后合成所有的链表。代码如下:

public ListNode mergeKLists(ListNode[] lists) {
   
   
	return merge(lists, 0, lists.length - 1);
}

public ListNode merge(ListNode[] lists, int left, int right) {
   
   
    if(left == right) {
   
   
        return lists[left];
    }
    if (left > right) {
   
   
        return null;
    }
    int mid = (left + right) >> 1;
    return mergeTwoLists(merge(lists, left, mid), merge(lists, mid + 1, right));
}

public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
   
   
    if(l1 == null) {
   
   
        return l2;
    }
    if(l2 == null) {
   
   
        return l1;
    }
    ListNode head = new ListNode(-1);
    ListNode cur = head;
    while(l1 != null && l2 != null) {
   
   
        if(l1.val < l2.val) {
   
   
            cur.next = l1;
            l1 = l1.next;
        }else {
   
   
            cur.next = l2;
            l2 = l2.next;
        }
        cur = cur.next;
    }
    cur.next = l1 == null ? l2:l1;
    return head.next;
}

现在我们来回顾一下归并排序的知识

一、归并排序

1. 归并排序的定义

  • 基本思路:借助外部空间,合并两个有序数组/序列,得到更长的数组
  • 算法思想:分而治之

比如对于数组[8,4,5,7,1,3,6,2]的排序:整体的过程是这样:先“分”成小问题,再进行“治”操作

2.归并排序算法代码实现

先来看看归并排序实现一个数组[8,4,5,7,1,3,6,2]的排序,难以理解的是合并相邻有序子序列这块,我们来看 [4,5,7,8] 和[1,2,3,6]这两个已经有序的子序列的合并:图片转自这篇博客图解排序算法(四)之归并排序

public int[] sortArray(int[] nums) {
   
   
    int[] temp = new int[nums.length];
    merge(nums, 0, nums.length - 1, temp);
    return nums;
}

public void <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

归思君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值