<刷题记录> 合并K个排序链表

LeetCode 第 23 题:合并 k 个排好序的链表,返回合并后的排序链表。分析和描述算法的复杂度。

 

示例

输入:

[

  1 -> 4 -> 5,

  1 -> 3 -> 4,

  2 -> 6

]

 

输出:1 -> 1 -> 2 -> 3 -> 4 -> 4 -> 5 -> 6

 

 

解一:暴力法

用一个数组保存所有链表中的数,然后对这个数组进行排序,再从头到尾将数组遍历一遍,生成一个排好序的链表。

 

解二:分治法

 

当 k=1 的时候,直接返回结果;当 k=2 的时候,把这两个链表归并。当 k=3 的时候,我们可以把它们分成两组,分别归并完毕后再进行最后的归并操作,如下。

 

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

    }

    public ListNode mergeList(ListNode[] lists,int low,int high){
        if(low == high) return lists[low];

        int mid = low + (high-low)/2;
      //递归地处理左边和右边的链表,最后合并 ListNode a = mergeList(lists,low,mid); ListNode b = mergeList(lists,mid+1,high); return mergeTwo(a,b); }   //合并两个链表 public ListNode mergeTwo(ListNode a, ListNode b){ if(a == null) return b; if(b == null) return a; ListNode head = new ListNode(0); ListNode temp = head; while(true){ if(a.val < b.val){ temp.next = a; temp = temp.next; a = a.next; }else{ temp.next = b; temp = temp.next; b = b.next; } if(a == null){ temp.next = b; break; } if(b == null){ temp.next = a; break; } } return head.next; }

 

 

 

猜你喜欢

转载自www.cnblogs.com/wangxiaoqian/p/12102225.html