23. Merge k Sorted Lists(java实现)

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

本题主要就是要让我们把k个已经排好序的linked lists进行一个合并从而组成一个新的排好序的list,对于这种已经排好序的list来说,我最先想到的是归并排序。不过对于我这种菜鸟小白来说,想到归并排序之后出现了一个问题-----我所认识到的归并排序是对一个数组进行排序,而本题中虽然也是一个数组,可是数组内的元素是一个linkedlist,此时想了好久才想明白。其实,还是和对普通数组排序一样。算法的基本思想:

  1. 对lists[]进行划分,也就是分解;(归并排序最后会将一个数组分解成一个个的单个元素,只不过我们这里是单个的linkedlist)
  2. 划分完成之后,就是自底向上的归并,即合并。(在合并的时候,对于最基本的归并排序来说,最底层的是单个的数值,我们只需要单纯的比较数值的大小就可以了。而此时,我们需要合并的是两个linkedlist,即就是merge two sorted linked lists,对于这个问题,如果不清楚可以先去了解一下二路合并)
  3. 合并完成之后,就得到了题目要求的a new sorted list;

下面附上代码:

    public class Solution {  
        public ListNode mergeKLists(ListNode[] lists)  
        {  
            return partition(lists, 0, lists.length - 1);  
        }  
      
        public static ListNode partition(ListNode[] lists, int start, int end)  
        {  
            if (start == end)  
                return lists[start];  
      
            if (start < end)  
            {  
                int mid = (start + end) / 2;  
                ListNode l1 = partition(lists, start, mid);  
                ListNode l2 = partition(lists, mid + 1, end);  
      
                return mergeTwoLists(l1, l2);  
            }  
            return null;  
      
        }  
      
        public static ListNode mergeTwoLists(ListNode l1, ListNode l2)  
        {  
            if (l1 == null)  
                return l2;  
      
            if (l2 == null)  
                return l1;  
      
            if (l1.val > l2.val)  
            {  
                ListNode temp = l2;  
                temp.next = mergeTwoLists(l1, l2.next);  
                return temp;  
            }  
            else  
            {  
                ListNode temp = l1;  
                temp.next = mergeTwoLists(l1.next, l2);  
                return temp;  
            }  
        }  
    }  


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值