前端算法面试必刷题系列[10]

233 阅读1分钟

这个系列没啥花头,就是纯 leetcode 题目拆解分析,不求用骚气的一行或者小众取巧解法,而是用清晰的代码和足够简单的思路帮你理清题意。让你在面试中再也不怕算法笔试。

16. 合并K个升序链表 (merge-k-sorted-lists)

标签

  • LinkList
  • 分治
  • 递归
  • 困难

题目

leetcode 传送门

这里不贴题了,leetcode打开就行,题目大意:

合并K个升序链表,还记得这篇,合并2个升序链表, 这个是困难版。

相关知识

  • 分而治之
  • 链表两两合并

基本思路

分治法的典型应用,还能借助2个列表合并的部分代码完成。

写法实现

// 分治,我们把大问题化小问题
var mergeKLists = function(lists) {
  let len = lists.length
  if (len === 0) {
    return null
  }
  if (len === 1) {
    return lists[0]
  }
  let midIdx = Math.floor(len / 2)
  let leftList = mergeKLists(lists.slice(0, midIdx))
  let rightList = mergeKLists(lists.slice(midIdx, len))
  return mergeTwoLists(leftList, rightList)
};
// 递归合并两个链表,方法同之前简单的
var 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
  }
};

年初七就来一题吧。

今天就到这儿,想跟我一起刷题的小伙伴可以加我微信哦 搜索我的微信号infinity_9368,可以聊天说地 加我暗号 "天王盖地虎" 下一句的英文,验证消息请发给我 presious tower shock the reiver monster,我看到就通过,暗号对不上不加哈