21. 合并两个有序链表几个链表题 - 图3

  1. const mergeTwoLists = function (l1, l2) {
  2. const prehead = new ListNode(-1)
  3. let prev = prehead
  4. while (l1 !== null && l2 !== null) {
  5. if (l1.val < l2.val) {
  6. prev.next = l1
  7. l1 = l1.next
  8. } else {
  9. prev.next = l2;
  10. l2 = l2.next
  11. }
  12. prev = prev.next
  13. }
  14. prev.next = (l1 === null ? l2 : l1);
  15. return prehead.next
  16. }
const mergeTwoLists = function(l1,l2){
  if(l1===null) return l2
  else if(l2===null) return l1
  else if(l1.val<l2.val){
    l1.next = mergeTwoLists(l1.next,l2)
    return l1
  }else{
    l2.next = mergeTwoLists(l1,l2.next)
    return l2
  }
}

总结:

  • 使用空头指针的技巧
  • <=``<都可以

23. 合并K个升序链表

var mergeKLists = function (lists) {
   return merge(lists, 0, lists.length - 1)
};

function merge(lists, l, r) {
    if (l === r) return lists[l]    // 一直递归到一个链表,返回该链表
    if (l > r) return null
    let mid = Math.floor((l + r) / 2)
    return mergeTwoLists(merge(lists, l, mid), merge(lists, mid + 1, r));
}

function mergeTwoLists(l1, l2) {...略}

几个链表题 - 图4