0
点赞
收藏
分享

微信扫一扫

合并K个升序链表

有点d伤 2022-02-14 阅读 114

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。

方法一:暴力解法
之前做过两个链表的升序排列,这次是n个,所以可以利用之前写的那个函数,然后遍历一遍一个一个合起来就行,如果数据太多,运行时间一定会超,一看200ms。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        ListNode listsum = null;
         int len = lists.length;
         for(int i=0;i<len;i++){
             listsum = Merge(listsum,lists[i]);
         }
        return listsum;
    }
    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;
        }
    }
}

方法二:
分治:
在这里插入图片描述
图片来自力扣

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        if(lists.length==0)
            return null;
        if(lists.length==1)
            return lists[0];
        int len = lists.length;
        int mid = len/2;
        ListNode []list1 = new ListNode[mid];
        for(int i=0;i<mid;i++)
            list1[i] =lists[i];
        ListNode []list2 =  new ListNode[len-mid];
        for(int i=0,j=mid;j<len;j++,i++)
            list2[i]=lists[j];
        return Merge(mergeKLists(list1),mergeKLists(list2));
        

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

相关推荐

0 条评论