Leecode刷题笔记——23. 合并K个排序链表

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

示例:

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

思路如下:
1、合并多个链表的基础是合并两个链表,因此可以考虑采用归并的方法实现
2、关键是如何进行2个2个的合并,这里采用二分法递归即可实现
3、需要注意的是二分法的中间int变量mid在递归时应该是mid和mid+1,而不是mid-1和mid,后者会导致栈溢出异常(StackOverflowException)

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        if(lists==null||lists.length==0){
            return null;
        }
        return mergeAll(lists,0,lists.length-1);
    }
    public ListNode mergeAll(ListNode[]lists,int left,int right){
        if(left==right){
            return lists[left];
        }
        int mid=left+(right-left)/2;
        ListNode l1=mergeAll(lists,left,mid);
        ListNode l2=mergeAll(lists,mid+1,right);
        return mergeTwo(l1,l2);
       
    }
    public ListNode mergeTwo(ListNode l1,ListNode l2){
        if(l1==null){
            return l2;
        }
        if(l2==null){
            return l1;
        }
        if(l1.val<=l2.val){
            l1.next=mergeTwo(l1.next,l2);
            return l1;
        }
        else{
            l2.next=mergeTwo(l1,l2.next);
            return l2;
        }
    }
}

原题地址:
23. 合并K个排序链表

你可能感兴趣的:(LeeCode刷题总结)