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

243 阅读2分钟

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

14. 合并两个有序链表 (merge-two-sorted-lists)

标签

  • 递归
  • LinkList
  • 简单

题目

leetcode 传送门

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

合并 2 个有序链表。

相关知识

我认为递归就是

  • 有递归出口
  • 自己调用自己

写递归代码的关键就是找到如何将大问题分解为小问题的规律,并且基于此写出递推公式,然后再推敲终止条件,最后将递推公式和终止条件翻译成代码

编写递归代码的关键是,只要遇到递归,我们就把它抽象成一个递推公式不用想一层层的调用关系不要试图用人脑去分解递归的每个步骤

基本思路

  1. 终止条件:当两个链表都为空时,表示我们对链表已合并完成。
  2. 如何自己调用自己:我们判断 l1 和 l2 头结点哪个更小,然后较小结点的 next 指针指向其余结点的合并结果。(调用递归)

递归写法实现

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
  }
};

迭代写法实现

var mergeTwoLists = function(l1, l2) {
  // 还是用一个前置节点
  let prehead = new ListNode(0)
  let prev = prehead
  while (l1 && l2) {
    if (l1.val < l2.val) {
      prev.next = l1
      l1 = l1.next
    } else {
      prev.next = l2
      l2 = l2.next
    }
    prev = prev.next
  }
  // 合并还未被合并完的剩下的直接用链表末尾指向即可
  prev.next = l1 ? l1 : l2
  return prehead.next
};

年初四就来一题吧。

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

参考