(递归)常规解法与分治法

合并k个已排序的链表

http://www.nowcoder.com/questionTerminal/65cfde9e5b9b4cf2b6bafa5f3ef33fa6

1.常规解法,从头到尾两两组合链表

    public ListNode mergeKLists(ArrayList<ListNode> lists) {
        if(lists==null || lists.size() == 0){
            return null;
        }
        ListNode result = lists.get(0);
        for(int i = 1; i < lists.size(); i++) {
            ListNode temp = lists.get(i);
            result = merge(result, temp);
        }
        return result;
    }

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

2.常规解法的改进,运用了分治思想的归并组合链表

    public ListNode mergeKLists(ArrayList<ListNode> lists) {
        if(lists==null || lists.size()==0) {
            return null;
        }
        return mergeLists(lists, 0, lists.size()-1);
    }
   public ListNode mergeLists(ArrayList<ListNode> lists,int low, int high) {
        if(low >= high) {
            return lists.get(low);
        }
        int mid = low + ((high-low) >> 1);
        ListNode l1 = mergeLists(lists,low,mid);
        ListNode l2 = mergeLists(lists,mid+1,high);
        return merge(l1, l2);
    }
   public ListNode merge(ListNode list1,ListNode list2) {
        if(list1 == null) {
            return list2;
        }
        if(list2 == null) {
            return list1;
        }
        if(list1.val < list2.val) {
            list1.next = merge(list1.next, list2);
            return list1;
        }else {
            list2.next = merge(list1, list2.next);
            return list2;
        }
    }  
全部评论

相关推荐

不愿透露姓名的神秘牛友
昨天 11:21
被夸真的超级开心,好可爱的姐姐
码农索隆:老色批们不用脑补了,我把金智妮的图找来了查看图片
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务