将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4]
示例 2:
输入:l1 = [], l2 = [] 输出:[]
示例 3:
输入:l1 = [], l2 = [0] 输出:[0]
解答一
- 先判断是 l1 插入 l2 还是 l2 插入 l1,这里的判断条件是,值大的插入值小的后面,将被插入的链表成为 res,插入链表是 willInsert
- 遍历 willInsert,当 res.next.val > willInsert.val 时,将 willInsert 插入 res 的下一个位置,否则 res 指针往下移动,查找willInsert下一个可能的插入位置。将 willInsert 插入 res 之后,又继续找 willInsert 的下一个节点的插入位置
ts
/**
* Definition for singly-linked list.
* class ListNode {
* val: number
* next: ListNode | null
* constructor(val?: number, next?: ListNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
* }
*/
function mergeTwoLists(list1: ListNode | null, list2: ListNode | null): ListNode | null {
if (!list1) return list2
if (!list2) return list1
// 将 willInsert 上的节点插入 res
let res: ListNode | null = list1.val < list2.val ? list1 : list2
let willInsert: ListNode | null = list1.val < list2.val ? list2 : list1
let result = res
while(willInsert) {
while(res) {
if (!res.next) {
res.next = willInsert
willInsert = null
break
}
if(res.next.val > willInsert.val) {
const temp = res.next
const temp2:ListNode | null = willInsert.next
res.next = willInsert
willInsert.next = temp
willInsert = temp2
res = res.next
break
}
res = res.next
}
}
return result
};
时间复杂度O(n + m),空间复杂O(1)
解答二
创建一个新的链表头,将 l1 和 l2 按照大小顺序插入其中
ts
/**
* Definition for singly-linked list.
* class ListNode {
* val: number
* next: ListNode | null
* constructor(val?: number, next?: ListNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
* }
*/
function mergeTwoLists(list1: ListNode | null, list2: ListNode | null): ListNode | null {
const newList = new ListNode(-1)
let current = newList
if(!list2) return list1
if (!list1) return list2
while(list2 && list1) {
if (list2.val > list1.val) {
current.next = list1
list1 = list1.next
} else {
current.next = list2
list2 = list2.next
}
current = current.next
}
current.next = list2 ? list2 : list1
return newList.next
};
时间复杂度O(n + m),空间复杂O(1)