剑指 Offer II 078. 合并排序链表

104 阅读1分钟

剑指 Offer II 078. 合并排序链表

分治思想

arr数组内的链表都是有序的,所以使用二分法+递归思想,拆分为单个链表,于是问题就转化为合并两个有序链表的问题,两个链表合并,取首位做比较,谁小,就拆一个,然后拆完后剩下的链表依然是看做一个完整的链表,于是进一步拆分两个子链表,直到有一个链表为空了,于是就返回另外一个链表就行

var mergeKLists = function (arr) {
  var len = arr.length;
  if (len < 2) {
    return arr[0] || null;
  }
  var mid =len >> 1;
  return merge(mergeKLists(arr.slice(0, mid)), mergeKLists(arr.slice(mid)));
};

var merge = function (l1, l2) {
  if (!l1) return l2
  if (!l2) return l1
  var p;
  if (l1.val > l2.val) {
    p = l2;
    p.next = merge(l1, l2.next);
  } else {
    p = l1;
    p.next = merge(l1.next, l2);
  }
  return p;
};