码迷,mamicode.com
首页 > 编程语言 > 详细

合并K个排序链表

时间:2019-04-08 01:01:00      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:返回   ==   ide   nod   示例   排序   ati   复杂度   divide   

合并 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。

示例:

输入:
[
  1->4->5,
  1->3->4,
  2->6
]
输出: 1->1->2->3->4->4->5->6

解法一:
  暴力法:逐一合并,直到数组结尾
  public ListNode mergeKLists(ListNode[] lists) {
        int len = lists.length;
        if(len == 0) return null;  
        int len = lists.length;
        if(len == 0) return null;
        ListNode dummy = new ListNode(-1);
        dummy.next = lists[0];
        int i = 1;
        while(i<len){
            dummy.next = merge(dummy.next,lists[i]);
            i = i + 1;
        }
        return dummy.next;
  }
//合并两个链表
    public static ListNode merge(ListNode l1, ListNode l2) {
        ListNode dummyHead = new ListNode(0);
        ListNode node = dummyHead;
        while(l1!=null && l2!=null){
            if(l1.val>=l2.val){
                node.next = l2;
                l2 = l2.next;
            }else{
                node.next = l1;
                l1 = l1.next;
            }
            node = node.next;
        }

        if(l1==null){
            node.next = l2;
        }
        if(l2==null){
            node.next = l1;
        }
        return dummyHead.next;
    }    

 

解法二:

  归并思想;

  public ListNode mergeKLists(ListNode[] lists) {
        int len = lists.length;
        if(len == 0) return null;
        return divide(lists,0,lists.length-1);
    }

    public static ListNode divide(ListNode[] lists,int l,int r){
        if(r == l){
            return lists[l];
        }
        int mid = (r - l) / 2 + l;
        ListNode l1 = divide(lists,l,mid);
        ListNode l2 = divide(lists,mid+1,r);
        return merge(l1,l2);
    }
    //合并两个链表
    public static ListNode merge(ListNode l1, ListNode l2) {
        ListNode dummyHead = new ListNode(0);
        ListNode node = dummyHead;
        while(l1!=null && l2!=null){
            if(l1.val>=l2.val){
                node.next = l2;
                l2 = l2.next;
            }else{
                node.next = l1;
                l1 = l1.next;
            }
            node = node.next;
        }

        if(l1==null){
            node.next = l2;
        }
        if(l2==null){
            node.next = l1;
        }
        return dummyHead.next;
    }

 

 //合并两个链表    public static ListNode merge(ListNode l1, ListNode l2) {        ListNode dummyHead = new ListNode(0);        ListNode node = dummyHead;        while(l1!=null && l2!=null){            if(l1.val>=l2.val){                node.next = l2;                l2 = l2.next;            }else{                node.next = l1;                l1 = l1.next;            }            node = node.next;        }
        if(l1==null){            node.next = l2;        }        if(l2==null){            node.next = l1;        }        return dummyHead.next;    }

合并K个排序链表

标签:返回   ==   ide   nod   示例   排序   ati   复杂度   divide   

原文地址:https://www.cnblogs.com/du001011/p/10668165.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!