Skip to content

01-递归 ​

题目 ​

面试题 08.06. 汉诺塔问题 ​

  • n 为 1 的情况下,直接把 A 上的元素移动到 B 就可以了(结束条件)
  • 其他情况:
    1. 先把上面的那部分利用 C 过渡区,把元素移动到 B
    2. 然后在把 A 的底层元素移动到 C
    3. 最后利用 A 这个过渡区,把 B 上的元素移动到 C

LC21. 合并两个有序链表 ​

思考:

  • 子问题:合并两个有序列表,并且返回最小元素的结点。
  • 截止条件:当其中一个列表为空的时候,就可以直接返回另一个列表

当然也可以换一个思路:

  • 子问题:找到较小的那一个节点,把这个节点添加到 result 后,然后这个节点往下移动一位,result 也要往下移动一位
  • 截止条件:当其中一个列表为 null 的时候,就可以返回了

思考 ​

众所周知,递归和迭代是可以相互转换的,那么就出现了一个问题:什么时候使用迭代比较方便,什么时候使用递归比较方便?

递归的展开图
递归的展开图
首先,我们需要明白一件事情,递归本质是一个深度优先遍历,它是会执行到最底部才会返回,遍历的过程就很像一颗树,而树的度的多少,决定代码从递归变为迭代方便程度

如果度为 1,那么把递归变为迭代就比较方便,因为不需要存储上一个节点的信息,但是一旦它的度超过了 1, 那么就比较麻烦了,因为需要引入栈来存储之前的节点的信息

LC206. 反转链表 ​

可以把链表看为一颗度为 1 的特殊的树。

子问题:获取到它的最后的节点,然后翻转一下,不过注意,这个是后序遍历