Merge k Sorted Lists

来源:互联网 发布:淘宝商品供应商 编辑:程序博客网 时间:2024/04/28 08:03

用类似归并排序的方式来实现。

先把Lists折半分成两部分,分别对左右两部分递归调用原函数,得到两个ListNode后,按照mergeTwoLists的思路,将两个有序list合并成一个有序的list。

递归的终止条件有两个,如果Lists.size()=0,返回null,如果size==1,则返回list.get(0)。

mergeTwoLists的思路,与合并两个有序数组类似,也需要额外的空间。

必须要注意的是,要首先构造新的链表头节点,最终返回的是头节点。

public ListNode mergeKLists(ArrayList<ListNode> lists) {        int len = lists.size();        if(len==0){            return null;        }        if(len==1){            return lists.get(0);        }        int middle=len/2;        ArrayList<ListNode> left = new ArrayList<ListNode>();        for(int i=0;i<middle;i++){            left.add(lists.get(i));        }        ListNode leftList = mergeKLists(left);        ArrayList<ListNode> right = new ArrayList<ListNode>();        for(int i=middle;i<len;i++){            right.add(lists.get(i));        }        ListNode rightList = mergeKLists(right);        return mergeTwoLists(leftList,rightList);    }                ListNode mergeTwoLists(ListNode l1,ListNode l2){        ListNode head = null;        if(l1 == null)return l2;        else if(l2 == null)return l1;        else{            if(l1.val < l2.val){                head = new ListNode(l1.val);                l1 = l1.next;            }else{                head = new ListNode(l2.val);                l2 = l2.next;            }         }        ListNode l = head;        while(l1!=null && l2!=null){            if(l1.val<l2.val){                l.next=new ListNode(l1.val);                l1=l1.next;            }else{                l.next=new ListNode(l2.val);                l2=l2.next;            }            l=l.next;        }        while(l1!=null){            l.next=new ListNode(l1.val);            l1=l1.next;            l=l.next;        }        while(l2!=null){            l.next=new ListNode(l2.val);            l2=l2.next;            l=l.next;        }        return head;    }

以上合并有序链表空间复杂度是O(N),mergeTwoLists有空间复杂度为O(1)的方法,可以参考一下。

0 0
原创粉丝点击