Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
题目描述
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
输入: l1 = [1,2,4], l2 = [1,3,4]
输出: [1,1,2,3,4,4]
示例 2:
输入: l1 = [], l2 = []
输出: []
示例 3:
输入: l1 = [], l2 = [0]
输出: [0]
提示:
- 两个链表的节点数目范围是
[0, 50] -100 <= Node.val <= 100l1和l2均按 非递减顺序 排列
题解
1.递归
我们可以通过递归的方式来进行,自己调用自己的函数来处理。
但是要注意如果其中一个链表的节点的值为空时,则返回另个一链表
const mergeTwoLists = (list1, list2) => {
if (!list1) return list2
if (!list2) return list1
if (list1.val < list2.val) {
list1.next = mergeTwoLists(list1.next, list2)
return list1
} else {
list2.next = mergeTwoLists(list1, list2.next)
return list2
}
}
2.迭代
通过 for 或者 while 来接近得到目标值的一种方式,叫做迭代。
创建一个头结点 prev
通过判断 两个链表节点值是否存在,若存在的话,进行比较,然后赋值给 prev.next。 否则将另一个链表的节点直接赋值给 prev.next
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
const mergeTwoLists = (list1, list2) => {
// 创建一个 ListNode 头结点
const prehead = new ListNode(-1)
let prev = prehead
while (list1 && list2) {
if (list1.val <= list2.val) {
prev.next = list1
list1 = list1.next
} else {
prev.next = list2
list2 = list2.next
}
prev = prev.next
}
// 如果其中一个为null,则连接另外一个
prev.next = list1 === null ? list2 : list1
return prehead.next
}
总结
该题目 15 :可以熟悉 递归 和 迭代 这两个方法分别的概念以及使用。