合并两个有序链表(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)
點擊查看更多內容
為 TA 點贊
評論
評論
共同學習,寫下你的評論
評論加載中...
作者其他優質文章
正在加載中
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦