【九月打卡】第33天 數(shù)據(jù)結(jié)構(gòu)和算法
標(biāo)簽:
算法與數(shù)據(jù)結(jié)構(gòu)
合并两个有序链表(leetcode - 21)
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
输入:l1 = [], l2 = []
输出:[]
输入:l1 = [], l2 = [0]
输出:[0]
思路一:(迭代)
- 新建一个空的合并链表,并创建一个指向它的指针
- 比较
list1
和list2
的头部,合并链表指向较小者 - 较小者链表指针后移,同时合并链表指针后移
- 循环2、3步,直至
list1
和list2
中有一个为空停止 - 当
list1
或者list2
为空时,合并链表的next
指向另外一个链表 - 返回合并链表的
next
代码实现
var mergeTwoLists = function(list1, list2) {
let res = new ListNode(0);
let p1 = res;
while(list1 && list2) {
if(list1.val < list2.val) {
p1.next = list1;
list1 = list1.next;
}else{
p1.next = list2;
list2 = list2.next;
}
p1 = p1.next;
}
p1.next = list1 === null ? list2 : list1;
return res.next;
};
复杂度分析:
时间复杂度:O(m + n)
空间复杂度:O(1)
思路二:(递归)
- 可以把合并链表分解成子问题
- 相当于两个链表头部较小者和剩余链表元素合并的结果
- 通过递归合并链表,直至有一个递归为空结束
- 返回合并链表
var mergeTwoLists = function(list1, list2) {
if(list1 === null) {
return list2
}else if(list2 === null) {
return list1
}else if(list1.val < list2.val){
list1.next = mergeTwoLists(list1.next, list2)
return list1
}else{
list2.next = mergeTwoLists(list2.next, list1)
return list2
}
}
复杂度分析:
时间复杂度:O(m + n)
空间复杂度:O(m + n)
點(diǎn)擊查看更多內(nèi)容
為 TA 點(diǎn)贊
評(píng)論
評(píng)論
共同學(xué)習(xí),寫下你的評(píng)論
評(píng)論加載中...
作者其他優(yōu)質(zhì)文章
正在加載中
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦