leetcode23-合并K个升序链表

42 阅读1分钟

题目 - 合并 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

解决思路

K个链表依此合并进结果链表

K个链表合并,乍一看难度较高,但是分解来看,我们可以先合并两个然后以合并后链表合并第三个,这样就将K个链表的合并问题,转化成两个有序链表的合并问题,而两个链表合并可以通过递归实现,代码如下:

 public ListNode mergeTwoList(ListNode list1,ListNode list2) {
         
         if(list1 == null) {
             return list2;
         }
         if(list2 == null) {
             return list1;
         }
         if(list1.val <= list2.val) {
             list1.next = mergeTwoList(list1.next,list2);
             return list1;
         }else{
             list2.next = mergeTwoList(list1,list2.next);
             return list2;
         }
 }

接下来我们遍历整个链表数组,逐一做两个链表合并操作即可,完整代码如下:

 class Solution {
     public ListNode mergeKLists(ListNode[] lists) {
         ListNode res= null;
         for(int i=0;i<lists.length;i++){
             res = mergeTwoList(res,lists[i]);
         }
         return res;
     }
 ​
     public ListNode mergeTwoList(ListNode list1,ListNode list2) {
         if(list1 == null) {
             return list2;
         }
         if(list2 == null) {
             return list1;
         }
         if(list1.val <= list2.val) {
             list1.next = mergeTwoList(list1.next,list2);
             return list1;
         }else{
             list2.next = mergeTwoList(list1,list2.next);
             return list2;
         }
 ​
     }
 }