LeetCode 之 JavaScript 解答第21題 —— 合併兩個有序鏈表(Merge Two Sorted Lists)


Time:2019/4/9
Title: Merge Two Sorted Lists
Difficulty: Easy
Author: 小鹿javascript


題目:Merge Two Sorted Lists

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

Solve:

▉ 算法思路

一、正常思路,循環遍歷迭代比較大小,每取出一個數據,將小數據加入到額外的數組中去,直到比較完畢,將其中一個剩餘的數組追加到額外的數組尾部。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...

相關文章
相關標籤/搜索