21. 合并两个有序链表
21. 合并两个有序链表
迭代
function mergeTwoLists(list1: ListNode | null, list2: ListNode | null): ListNode | null {
if (!list1) {
return list2
}
if (!list2) {
return list1
}
// 记录下来当前的值和上一个结点的值,然后往中间插入
// 使用两个指针指向当前遍历到的链表的位置
// 每次都将更小的值插入结果末尾
// 最终就是有序的
// 新建一个结点,这样无论哪个链表是开头
// 最终结果都是 dummyHead.next 为开头
const dummyHead = new ListNode()
let p = dummyHead // 结果链表的末尾结点
let p1 = list1 // 第一个链表当前遍历到的结点
let p2 = list2 // 第二个链表当前遍历到的结点
// 每次将两个指针所在的结点进行比较
// 将更小的接到 dummyHead 的 p 的末尾
while (p1 && p2) {
if (p1.val < p2.val) {
p.next = p1
p1 = p1.next
} else {
p.next = p2
p2 = p2.next
}
p = p.next
}
// 剩下的没有处理的要么是 p1,要么是 p2
// 直接放在 p 的末尾即可
if (p1) {
p.next = p1
} else {
p.next = p2
}
return dummyHead.next
}
递归
function mergeTwoLists(list1: ListNode | null, list2: ListNode | null): ListNode | null {
if (!list1) {
return list2
}
if (!list2) {
return list1
}
// 对于两个链表合并来说
// 相当于将一个结点和下一个结点与另一个链表合并
// 所以可以递归解决
// 如果 list1 比 list2 小
// 要合并的是 list1 + (list1.next, list2)
if (list1.val < list2.val) {
// 将 list1.next 指向合并结果
list1.next = mergeTwoLists(list1.next, list2)
return list1
} else {
// 要合并的是 list2 + (list2.next, list1)
// 将 list1.next 指向合并结果
list2.next = mergeTwoLists(list2.next, list1)
return list2
}
return mergeTwoLists(list1, list2)
}