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...