一、题目描述
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
二、解题思路过程
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} list1
* @param {ListNode} list2
* @return {ListNode}
*/
var mergeTwoLists = function(list1, list2) {
var prehead = new ListNode(-1); // 创建一个链表
var prev = prehead; // 将指针指向头指针
while(list1!=null&&list2!=null){ // 当两个有序链表都不为空时,说明还未完成合并,所以应当执行循环
// 将两个链表中较小的值添加到链表中
if(list1.val<=list2.val){
prev.next=list1;
list1=list1.next;
}else{
prev.next=list2;
list2=list2.next;
};
prev=prev.next;
};
// 当循环执行结束后,说明两个有序链表中有一个链表已经为空,再将不为空的那一个链表剩余的项添加到我们的链表后面
prev.next=(list1===null)?list2:list1;
return prehead.next;
};
三、复杂度分析
时间复杂度:,其中 n 和 m 分别为两个链表的长度。因为每次循环迭代中,list1 和 list2 只有一个元素会被放进合并链表中, 因此 while 循环的次数不会超过两个链表的长度之和。所有其他操作的时间复杂度都是常数级别的,因此总的时间复杂度为
。
空间复杂度:。我们只需要常数的空间存放若干变量。
四、题目来源
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/merge-two-sorted-lists