题目描述:
大致思路:
先创建一个空链表tmp, 然后while循环 l1、l2, 当l1、l2中任意一个为null时, 结束循环。
循环中比较 l1 与 l2的值, 将空链表的 next指向值较小的那个, 最后 tmp 指向 tmp的next, 当然, 这样最后会有个问题, 拿到的tmp并不是完整的合并后的链表, 所以我们还得再最开始创建另一个空链表, 指向tmp, 最后空链表的 next即为完整的排完顺序的链表。
完整代码如下:
/**
* 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(l1: ListNode | null, l2: ListNode | null): ListNode | null {
//两个都为空, 直接返回null
if (!l1 && !l2) return null;
let tmp = new ListNode();
let res = tmp;
while (l1 && l2) {
if (l1.val < l2.val) {
tmp.next = l1;
l1 = l1.next;
} else {
tmp.next = l2;
l2 = l2.next;
}
tmp = tmp.next;
}
//有一个为空
if (!l1) {
//l1 为空, 直接将l2拼在 tmp上
tmp.next = l2;
} else {
//l2 为空, 直接将l1拼在 tmp上
tmp.next = l1;
}
return res.next;
}
最后贴上 🧍♂️ 递归思路:
if(!l1) return l2;
if(!l2) return l1;
if (l1!.val < l2!.val) {
l1!.next = mergeTwoLists(l1?.next ?? null, l2);
return l1;
}
l2!.next = mergeTwoLists(l1, l2!.next ?? null);
return l2;