21. Merge Two Sorted Lists && 23. Merge k Sorted Lists

21. Merge Two Sorted Lists

Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.

 
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        if(l1 == null)
            return l2;
        if(l2 == null)
            return l1;
        ListNode dummy = new ListNode(0);
        ListNode rc = dummy;
        
        while(l1 !=null && l2 !=null)
        {
            if(l1.val<l2.val)
            {
                rc.next = l1;
                l1 = l1.next;
            }
            else
            {
                rc.next = l2;
                l2 = l2.next;
            }
            rc = rc.next;
        }
        
        if(l1 == null)
            rc.next = l2;
        else
            rc.next = l1;
        
        return dummy.next;
    }
}

 

23. Merge k Sorted Lists

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

 

Divide and Conquer solution:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
  public ListNode mergeKLists(ListNode[] lists) {
    return mergeKLists(lists, 0, lists.length - 1);
  }

  //[from, to]
  public ListNode mergeKLists(ListNode[] lists, int from, int to) {
    if (from > to)
      return null;
    if (from == to)
      return lists[from];
    if (to - from == 1) {
      ListNode left = lists[from];
      ListNode right = lists[to];
      return merge2Lists(left, right);
    } else {
      int mid = (from + to) / 2;
      ListNode leftMerged = mergeKLists(lists, from, mid);
      ListNode rightMerged = mergeKLists(lists, mid + 1, to);
      return merge2Lists(leftMerged, rightMerged);
    }
  }

  private ListNode merge2Lists(ListNode l1, ListNode l2) {
    if (l1 == null) return l2;
    if (l2 == null) return l1;

    ListNode fake = new ListNode(0);
    ListNode current = fake;
    while (l1 != null && l2 != null) {
      if (l1.val <= l2.val) {
        current.next = l1;
        l1 = l1.next;
      } else {
        current.next = l2;
        l2 = l2.next;
      }
      current = current.next;
    }

    if (l1 != null) current.next = l1;
    if (l2 != null) current.next = l2;

    return fake.next;
  }
}

 

 

 

posted @ 2016-04-12 13:15  新一代的天皇巨星  阅读(144)  评论(0编辑  收藏  举报