leetcode 23. Merge k Sorted Lists and 21. Merge Two Sorted Lists

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

Example:

Input:
[
  1->4->5,
  1->3->4,
  2->6
]
Output: 1->1->2->3->4->4->5->6


开始使用暴力解法遍历每个链表的结点,小的那一个添加到新节点。但是超时了。时间复杂度O(kn),k为链表个数,n为总节点数。后来参考别人思路用了分治法。这是一道很好的分治法的题,时间复杂度O(nlogk)。问题2是问题1的子问题,代码中主要都是合并两个链表。问题2代码中关于初始条件处理用了不同写法,更简洁点。

问题1:

 public ListNode mergeKLists(ListNode[] lists) {
        if(lists==null||lists.length==0) return null;
        return merge(lists,0,lists.length-1);
    }
    public ListNode merge(ListNode[] lists,int start,int end){//合并start到end的节点
        if(start==end) return lists[start];
        ListNode listnode1=merge(lists,start,(start+end)/2);
        ListNode listnode2=merge(lists,(start+end)/2+1,end);
        //合并两个链表,定义练个节点之下listnode1和listnode2的当前结点
        ListNode cur1=listnode1,cur2=listnode2,cur3=null;
        ListNode head=null;
        while(true){
            if(cur2==null){
                if(cur3==null){
                    cur3=cur1;
                    head=cur3;
                }else{
                    cur3.next=cur1; 
                }
                break;
            }else if(cur1==null){
                if(cur3==null){
                    cur3=cur2;
                    head=cur3;
                }else{
                    cur3.next=cur2; 
                }
                break;
            }
            if(cur1.val<cur2.val){
                if(cur3==null){
                    cur3=cur1; 
                    head=cur3;
                }else{
                    cur3.next=cur1;
                    cur3=cur3.next; 
                }
                cur1=cur1.next;
            }else{
                if(cur3==null){
                    cur3=cur2; 
                    head=cur3;
                }else{
                    cur3.next=cur2;
                    cur3=cur3.next; 
                }
                cur2=cur2.next;
            }
            
        }
        return head;
    }


问题2:

public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        if(l1==null) return l2;
        if(l2==null) return l1;
        ListNode cur1=l1,cur2=l2,cur3=null;
        ListNode head=null;
        if(cur1.val>cur2.val){//初始情况
            head=cur2;
            cur2=cur2.next;
        }
        else if(cur1.val<=cur2.val){
            head=cur1;
            cur1=cur1.next;
        }
        cur3=head;
        while(true){
            if(cur1==null){
                cur3.next=cur2;
                break;
            }
            if(cur2==null){
                cur3.next=cur1;
                break;
            }
            if(cur1.val<cur2.val){
                cur3.next=cur1;
                cur1=cur1.next;
            }else{
                cur3.next=cur2;
                cur2=cur2.next;
            }
            cur3=cur3.next;
        }
        return head;
    }

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页