【路飞】链表-合并K个升序链表

224 阅读1分钟

「这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战

在做合并K个升序链表的困难题目前,我们先来看一个简单的合并两个有序链表题目

题目1:21. 合并两个有序链表

image.png

解答

var mergeTwoLists = function (l1, l2) {
  let dummyHead = new ListNode(-1);
  let m1 = l1;
  let m2 = l2;
  let cur = dummyHead;
  while (m1 && m2) {
    // 将小的放入新链表
    if (m1.val < m2.val) {
      cur.next = m1;
      m1 = m1.next;
    } else {
      // 将大的放入新链表
      cur.next = m2;
      m2 = m2.next;
    }
    cur = cur.next;
  }
  // 如果有一个链表已经遍历完了,那么直接将另一个链表的剩余部分接到cur.next
  cur.next = m2 ? m2 : m1;
  return dummyHead.next;
};

题目2:23. 合并K个升序链表

image.png

分析

1、利用上面解出的合并两个链表的方法,将数组链表的值两两放到该方法里面求和;

var mergeKLists = function(lists) {
  let prev = null;
  for(let i = 0; i < lists.length; i++) {
    if(!prev) {
      prev = lists[i];
      continue;
    }
    prev = mergeTwoLists(prev, lists[i]);
  }
  return prev;
};

var mergeTwoLists = function (l1, l2) {
  let dummyHead = new ListNode(-1);
  let m1 = l1;
  let m2 = l2;
  let cur = dummyHead;
  while (m1 && m2) {
    if (m1.val < m2.val) {
      cur.next = m1;
      m1 = m1.next;
    } else {
      cur.next = m2;
      m2 = m2.next;
    }
    cur = cur.next;
  }
  cur.next = m2 ? m2 : m1;
  return dummyHead.next;
};

写在最后

本来的解答都经过了力扣的校验,文章写的有些匆忙,实现方式上有啥不足的欢迎指正,如果还有其它好的实现方式也欢迎在留言区讨论。