Time:2019/4/9
Title: Merge Two Sorted Lists
Difficulty: Easy
Author: 小鹿javascript
Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.java
Example:node
Input: 1->2->4, 1->3->4 Output: 1->1->2->3->4->4
一、正常思路,循环遍历迭代比较大小,每取出一个数据,将小数据加入到额外的数组中去,直到比较完毕,将其中一个剩余的数组追加到额外的数组尾部。git
二、递归思路,知足递归的三个条件:github
- 将问题能不能化为子问题去解决?
- 子问题的解决方式是否和总问题类似?
- 是否有终止条件?
var mergeTwoLists = function(l1, l2) { let result = null; //终止条件 if(l1 == null) return l2; if(l2 == null) return l1; //判断数值大小递归 if(l1.val < l2.val){ result = l1; result.next = mergeTwoLists(l1.next,l2); }else{ result = l2; result.next = mergeTwoLists(l2.next,l1); } //返回结果 return result; };
其实递归最难的就是咱们应该怎么去理解它,当咱们彻底理解了递归以后,就会发现递归很是方便,代码简洁。咱们常常理解递归会陷入到递归的细节上去,每每只递,归的时候就彻底模糊了,我也试着找了网上的关于递归解释的,这么说吧,关于递归理解和使用,只有总结出本身的一套理解方法,才能真正的掌握递归,下面总结一下我本身理解的递归。算法
一、明确递归能够解决什么问题,也就是上边所讲到的解决的问题应该知足递归的三个条件。详细分开讲解:数组
① 一看参数和 return。什么意思呢?好比上方合并链表的代码,分别明确函数的参数和返回值是什么?参数是两个合并的链表结点头结点。返回值是合并后的链表。函数
② 二凑参数和return。就是说咱们要去按照参数和返回值去用递归伪造它,比较完成第一个结点,固然传入第二个节点,返回第一个结点到新链表尾部,那么递归就会返回新链表的下一结点。要屏蔽掉递归的细节,只看参数和返回值。code
有时候问题可使用递归,可是因为递归的缺点会放弃使用。一、递归警戒堆栈溢出。递归
二、警戒递归重复元素计算。
三、递归的高空间复杂度。
一、将问题化为子问题。二、解决子问题。
三、寻找终止条件。
四、写出递归公式。
五、将递推公式转化为代码。
欢迎一块儿加入到 LeetCode 开源 Github 仓库,能够向 me 提交您其余语言的代码。在仓库上坚持和小伙伴们一块儿打卡,共同完善咱们的开源小仓库!
Github:https://github.com/luxiangqia...