這是我參與8月更文挑戰的第1天,活動詳情查看:8月更文挑戰javascript
你們好今天給你們分享下一道 LeetCode 簡單難度 的題目[合併兩個有序鏈表]前端
這裏主要是分享思路和註釋,供你們更好的理解題目解法,代碼部分是參考LeetCode 轉寫成javascript 代碼,java
將兩個升序鏈表合併爲一個新的 升序 鏈表並返回。新鏈表是經過拼接給定的兩個鏈表的全部節點組成的。算法
![圖片轉載leetCode]markdown
示例1
輸入:l1 = [1,2,4], l2 = [1,3,4]
輸出:[1,1,2,3,4,4]
示例 2:
輸入:l1 = [], l2 = []
輸出:[]
示例 3:
輸入:l1 = [], l2 = [0]
輸出:[0]
複製代碼
分析網絡
1.2個升序鏈表合併爲一個升序鏈表app
2.合併到鏈表=》改變節點的指向ide
解法oop
1.迭代post
2.遞歸
思路
1.定義一個dummy節點,爲主軸
2.迭代2個鏈表,比較大小
3.小的先放入主軸中
4.餘下的未迭代完的鏈表須要繼續進行配置
*/
var mergeTwoLists = function (l1, l2) {
// 設置的一個dummy爲主軸
const dummy = new ListNode(0);
let cur = dummy;
// 同時迭代l1 l2
while (l1 && l2) {
// 由於是升序因此 若是l1.val<l2.val 就把l1放入主軸中
if (l1.val <= l2.val) {
cur.next = l1;
l1 = l1.next;
// 反之也是
} else {
cur.next = l2;
l2 = l2.next;
}
// 移動cur到下一個位置待命
cur = cur.next;
}
//若是l1還有值說明 l1尚未迭代完成把全部l1放入主線程中
while (l1) {
cur.next = l1;
cur = cur.next;
l1 = l1.next;
}
//若是l2還有值說明 l2尚未迭代完成把全部l2放入主線程中
while (l2) {
cur.next = l2;
cur = cur.next;
l2 = l2.next;
}
// 返回主線程的第一個節點
return dummy.next;
};
/* 複雜度 時間 O(n1+n2) n1爲li的長度 n2爲l2的長度 空間 O(1) */
複製代碼
思路
1.終止條件 l1或者l2爲null的時候返回
2.遞歸每一層就作比較和合並
*/
var mergeTwoLists = function (l1, l2) {
const cur = new ListNode(0);
function mergeTwoListsRecursive(l1, l2, cur) {
//若是l1還有值說明 l1尚未迭代完成把全部l1放入主線程中
if (!l1) {
while (l2) {
cur.next = l2;
l2 = l2.next;
cur = cur.next;
}
return;
}
//若是l2還有值說明 l2尚未迭代完成把全部l2放入主線程中
if (!l2) {
while (l1) {
cur.next = l1;
l1 = l1.next;
cur = cur.next;
}
return;
}
// 比較大小 小的先放入主軸
if (l1.val <= l2.val) {
cur.next = l1;
l1 = l1.next;
} else {
cur.next = l2;
l2 = l2.next;
}
cur = cur.next;
mergeTwoListsRecursive(l1, l2, cur);
}
mergeTwoListsRecursive(l1, l2, cur);
return cur.next;
};
/* 複雜度 時間 O(n1+n2) n1爲li的長度 n2爲l2的長度 空間 O(1) */
複製代碼
這道題考察對鏈表升序組合的理解,小的放前面
你們能夠看看我分享的一個專欄(前端搞算法)裏面有更多關於算法的題目的分享,但願可以幫到你們,我會盡可能保持天天晚上更新,若是喜歡的麻煩幫我點個贊,十分感謝
文章內容目的在於學習討論與分享學習算法過程當中的心得體會,文中部分素材來源網絡,若有侵權,請聯繫刪除,郵箱 182450609@qq.com