这是我参与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