前端菜鳥的每週一道算法題(三) 合併兩個有序鏈表

1、啥是鏈表?

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

2、鏈表的基本元素有哪些?

  • 1.節點:每一個節點有兩個部分,左邊部分稱爲值域,用來存放用戶數據;右邊部分稱爲指針域,用來存放指向下一個元素的指針。
  • 2.head:head節點永遠指向第一個節點
  • 3.tail: tail永遠指向最後一個節點
  • 4.None:鏈表中最後一個節點的指針域爲None值

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

3、如何合併兩個有序鏈表?

問題分析前端

  • 一、考慮兩個鏈表L1,L2中數據的多少
  • 二、空值的狀況
  • 三、用兩個指針同時遍歷兩個有序鏈表L1,L2,而且比較每次讀取的兩個鏈表元素的數值,將其中的小值插入到新的鏈表L中。
  • 四、考慮到其中鏈表L1(或者L2)因爲元素少,而被先遍歷完,另個鏈表L2(或者L1)直接接在新的鏈表L表尾;
  • 五、函數返回新鏈表L的表頭。

實現要點bash

一、設置指針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-合併連個有序鏈表進行驗證。ui

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

參考連接:spa

鏈表基礎知識總結.net

js實現鏈表

數據結構——鏈表

掃一掃下面的二維碼,回覆學習便可免費領取最新前端學習資料,也但願在前端進階的路上,咱們一塊兒成長,一塊兒進步!

相關文章
相關標籤/搜索