LeetCode23

来源:互联网 发布:二维动画软件大全 编辑:程序博客网 时间:2024/06/14 03:03

【题目】

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;}}


原创粉丝点击