目录
1. 题目链接:
2. 思路分析:
1. 重复子问题?
2. 具体子问题?
3. 递归出口?
3. 代码实现:
4. 小结:
1. 循环(迭代) vs 递归
2. 递归 vs 深搜
1. 题目链接:
21. 合并两个有序链表
题意:给两个升序的链表,将这两个链表合并成一个新的升序的链表。
2. 思路分析:
使用递归解决问题,最重要的一点是:找到重复子问题。我们分成3个步骤来说:
1. 重复子问题?
2. 具体子问题?
1. 比较L1和L2指向的节点谁更小?(假设L1更小)
2. L1->next = def(Node *L1->next, Node *L2);
3. return L1;
3. 递归出口?
当一个指针指向为NULL的时候,返回另一个指针所指向的节点。
3. 代码实现:
4. 小结:
1. 循环(迭代) vs 递归
递归的核心:找到重复的子问题
循环的目的:解决重复的问题
我们发现他们这两个解决的是同样的问题,那么就证明他们的代码是可以相互转换的!
但有时候我们发现他们之间代码转换是很麻烦的!(怎么弄?下面说)
2. 递归 vs 深搜
当递归的展开图顺序,是一个树的深度优先遍历的顺序的时候,我们知道,树的深度优先遍历是要借助栈的,所以这时候使用递归来实现就会方便一点。
当递归的展开图顺序,是一个链表的时候,将递归代码转为循环代码可能相对容易一些。比如遍历数组。