LeetCode23 - merge k sorted lists

【题目】

merge k sorted lists

即将k个有序排列的list融合成一个有序排列的list

【思路】

分治的方法很容易想到,所以本文采用常规思路进行求解

共有k个list,假设其中最长的一个list由n个元素

建立一个最大长度为k的Linkedlist,用于存放k个list尚未排序部分的第一个元素,并进行排序;

选取Linkedlist中第一个元素及当前待排序序列中最小的元素,放入结果中,并用该元素的next节点来替换该元素,若为null则直接删除该节点即可,并重新对Linkedlist进行排序;

重复上述步骤,直至Linkedlist为空。

由于Linkedlist维护的时间花销,该算法的事件复杂度为O(nklogk)。

【Java代码】

	public ListNode mergeKLists(ListNode[] lists){
		if(lists.length == 0)
			return null;
		else if(lists.length == 1)
			return lists[0];
		else{
			ListNode result = new ListNode(0);
			LinkedList<ListNode> candidate = new LinkedList<ListNode>();
			for(int i = 0 ; i < lists.length ; i++){
				if(lists[i] == null) 
					continue;
				candidate.add(lists[i]);
			}
			Collections.sort(candidate,new Comparator<ListNode>(){
				public int compare(ListNode l1,ListNode l2){
					return l1.val - l2.val;
				}
			});
			
			ListNode s = result;
			while(!candidate.isEmpty()){
				ListNode n = new ListNode(candidate.get(0).val);
				s.next = n; 
				s = s.next;
				ListNode temp = candidate.get(0).next;
				candidate.remove(candidate.get(0));
				if(temp != null){
					candidate.add(temp);
					Collections.sort(candidate,new Comparator<ListNode>(){
						public int compare(ListNode l1,ListNode l2){
							return l1.val - l2.val;
						}
					});
				}
			}
			return result.next;
		}
	}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值