您的位置:首页 > 其它

LeetCode23 - merge k sorted lists

2017-08-07 15:23 453 查看
【题目】

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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode linkedlist