数据解构和算法

52.算法->合并k个升序的链表

2022-02-12  本文已影响0人  wo不是黄蓉

day4:算法->合并k个升序链表

思路:乍一看又是数组又是链表的怎么肥事。
先来理解一下题目:给定一个数组,数组里面存的项是多个链表,此时我们不由地想起来之前做过合并两个升序链表的问题,这不就来思路了。

/**
 * @param {ListNode[]} lists
 * @return {ListNode}
 * 两两合并
 *
 */
var mergeKLists = function (lists) {
  //需要判断为空的情况
  if (null == lists || lists.length == 0) {
    return null;
  }
  //两两进行合并,创建一个空的链表或者将第一个作为链表头都可以
  let newList = lists[0];
  for (let i = 1; i < lists.length; i++) {
    let listi = lists[i];
//每次返回的结果就是两个链表合并后的结果,依次进行合并即可
    newList = mergeTwoLists(newList, listi);
    console.log("newList", newList);
  }
  return newList;
};

var mergeTwoLists = function (l1, l2) {
  console.log(l1, l2);
  let newlist = new ListNode(0);
  let head = newlist;
  while (l1 && l2) {
    if (l1.val < l2.val) {
      head.next = l1;
      l1 = l1.next;
    } else {
      head.next = l2;
      l2 = l2.next;
    }
    head = head.next;
  }
  if (l1) {
    head.next = l1;
  }
  if (l2) {
    head.next = l2;
  }
  return newlist.next;
};


//分而治之
function mergeKLists1(lists) {
  return merge(lists, 0, lists.length);
}
function merge(lists, l, r) {
  if (l == r) {
    return lists[l];
  }
  if (l > r) {
    return null;
  }
//一个很巧妙的地方,利用位移运算,可以直接求出平均值,相当于Math.ceil()
  let mid = (l + r) >> 1;
  return mergeTwoLists(merge(lists, l, mid), merge(lists, mid + 1, r));
}
//第二种方法,当 l!=r的时候,继续进行分组,直到 l=r开始进行参与合并运算
// mid = 1 ,l=0,r=2,mergeTwoLists(merge(lists,0,1),merge(lists,2,2))[-2, -1, 0, 2]
// mid = 0 ,l=0,r=1,mergeTwoLists(merge(lists,0,0),merge(lists,1,1))[-1, 1][-3, 1, 4]

不懂什么是位运算符的看这里->位运算符
想证明一下【利用位移运算,可以直接求出平均值】的看这个【十进制转二进制】、【二进制转十进制

上一篇 下一篇

猜你喜欢

热点阅读