一、啥是連結串列?
- 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
指標指向l2
的val,
,然後改變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-合併連個有序連結串列進行驗證。
歡迎小夥伴評論區提出更好的解決方案,記得點贊?鼓勵下哦!
參考連結:
掃一掃下面的二維碼,回覆學習即可免費領取最新前端學習資料,也希望在前端進階的路上,我們一起成長,一起進步!