leetcode

合并k个有序链表

 主要思想是分治和递归,首先用二分法将k个链表不断二分,直到细分到两个链表,然后将这两个有序链表合并,然后继续重复合并的过程,直到所有链表合并完成。可以理解成不停的拆分,拆分至合并两个有序链表的子问题。然后组装若干个子问题,直到所有子问题解决就得到原问题的解。

      

                /*
        * 合并k个有序链表
         */
    public ListNode mergeKLists(ListNode[] lists) {
        if(lists==null || lists.length==0) return null;
        return merge(lists, 0, lists.length-1);
    }

    private ListNode merge(ListNode[] lists, int left, int right) {
        if(left==right) return lists[left];
        int mid = left+(right-left)/2;
        ListNode l1 = merge(lists, left, mid);
        ListNode l2 = merge(lists, mid+1, right);
        return mergeTwoLists(l1, l2);
    }
    /*
     * 合并两个有序链表(递归)
     */
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        if(l1==null)
            return l2;
        if(l2==null)
            return l1;
        
        if(l1.val<=l2.val){
            l1.next = mergeTwoLists(l1.next,l2);
            return l1;
        }else{
            l2.next = mergeTwoLists(l1,l2.next);
            return l2;
        }
    }

 

  合并两个有序链表有两种方式,递归和非递归,上面是递归的代码,下面是非递归的代码

    

          /*
     * 合并两个有序链表(迭代)
     */
    public ListNode mergeTwoLists2(ListNode l1, ListNode l2) {
        ListNode prehead = new ListNode(-1);
        ListNode prev = prehead;
        while(l1!=null && l2!=null){
            if(l1.val<=l2.val){
                prev.next = l1;
                l1 = l1.next;
            }else{
                prev.next = l2;
                l2 = l2.next;
                prev = prev.next;
            }
        }
        prev.next = l1==null?l2:l1;
        return prehead.next;
    }
View Code

 

posted @ 2019-11-01 11:22  史蒂芬闰土  阅读(174)  评论(0编辑  收藏  举报