前端菜鳥的每週一道演算法題(三) 合併兩個有序連結串列

極客James發表於2019-09-16

一、啥是連結串列?

  • 1.是由一組節點組成的的集合,其中每個資料項都是一個節點的一部分,每個節點還包含指向下一個節點的連結。
  • 2.連結串列是結構體最重要的應用, 它是一種非固定長度的資料結構,是一種動態儲存技術, 它能夠根據資料的結構特點和數量使用記憶體,尤其適用於資料個數可變的資料儲存。

二、連結串列的基本元素有哪些?

  • 1.節點:每個節點有兩個部分,左邊部分稱為值域,用來存放使用者資料;右邊部分稱為指標域,用來存放指向下一個元素的指標。
  • 2.head:head節點永遠指向第一個節點
  • 3.tail: tail永遠指向最後一個節點
  • 4.None:連結串列中最後一個節點的指標域為None值

前端菜鳥的每週一道演算法題(三) 合併兩個有序連結串列

頭指標與頭結點以及首元結點的關係:

前端菜鳥的每週一道演算法題(三) 合併兩個有序連結串列

三、如何合併兩個有序連結串列?

問題分析

  • 1、考慮兩個連結串列L1,L2中資料的多少
  • 2、空值的情況
  • 3、用兩個指標同時遍歷兩個有序連結串列L1,L2,並且比較每次讀取的兩個連結串列元素的數值,將其中的小值插入到新的連結串列L中。
  • 4、考慮到其中連結串列L1(或者L2)由於元素少,而被先遍歷完,另個連結串列L2(或者L1)直接接在新的連結串列L表尾;
  • 5、函式返回新連結串列L的表頭。

實現要點

1、設定指標t1遍歷L1,指標t2遍歷L2,指標Ptr指向合適的結點(在L1中的結點,或者L2中的結點)來構造新的連結串列L。

程式碼實現方案一:建立一個新的連結串列用來儲存排列資料, 然後用while迴圈檢測l1和l2中的val值,如果l1.var<=l2.var,那麼就讓新連結串列的next指標指向l1的val,,然後改變l1的指標指向並且將l1的下一個值指向l1,依次迭代,反之,如果l1.val>l2.var 那麼就讓新連結串列的next指標指向l2val,,然後改變l2的指標指向並且將l2的下一個值指向l2,依次迭代,直到左右節點迭代完,判斷l1是否為空,返回新連結串列l3.

<script>
    function mergeTwoLists(l1, l2) {
        var l3 = new ListNode(-1);
        var c3 = l3;

        while (l1 !== null && l2 !== null) {
            if (l1.val <= l2.val) {
                c3.next = l1;
                l1 = l1.next;
            } else {
                c3.next = l2;
                l2 = l2.next;
            }
            c3 = c3.next;
        }
        c3.next = (l1 === null) ? l2 : l1;
        return l3.next;
    }

    // 自定義一個連結串列
    function ListNode(val) {
        this.val = val;
        this.next = null;
    }
</script>
複製程式碼

實現方法二:遞迴

function mergeTwoLists(l1, l2) {
    if (l1 = null && l2 == null) {
        return null;
    }
    if (l1 == null) {
        return l2;
    }
    if (l2 == null) {
        return l1;
    }
    if (l1.val < l2.val) {
        l1.next = mergeTwoLists(l1.next, l2);
        return l1;
    } else {
        l2.next = mergeTwoLists(l1, l2.next);
        return l2;
    }
}
複製程式碼

可以複製以上程式碼到leetcode-合併連個有序連結串列進行驗證。

歡迎小夥伴評論區提出更好的解決方案,記得點贊?鼓勵下哦!

參考連結:

連結串列基礎知識總結

js實現連結串列

資料結構——連結串列

掃一掃下面的二維碼,回覆學習即可免費領取最新前端學習資料,也希望在前端進階的路上,我們一起成長,一起進步!

前端菜鳥的每週一道演算法題(三) 合併兩個有序連結串列

相關文章