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 <= 100
l1 和 l2 均按 非递减顺序 排列
二、题目和思路分析:
链表的合并,看起来没什么难的,所以我的思路是这样的:
合并链表
取两个链表头部最小的那个作为下一个链表
如果其中一个链表为空,直接把另一个链表加进去,结束
递归调用即可
思路看起来没错,写的的时候还是要思考一下回调方法的逻辑。
递归调用到最后,一定有一个链表指向为null,所以本质上是从最后一个val最大的节点开始向前拼接,这样想的话,更容易理解一些。
三、代码:
代码实现如下:
/**
* 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) {
return mergeNodes(list1, list2)
function mergeNodes(list1, list2){
if(list1 == null){ return list2}
if(list2 == null){ return list1}
if(list1.val < list2.val){ // 以list1第一个节点开头
list1.next = mergeNodes(list1.next, list2) // 递归调用,返回下一个节点
return list1
}else{ // 以list2第一项开头
list2.next = mergeNodes(list1, list2.next) // 递归调用,返回下一个节点
return list2
}
}
};
四、总结:
这是今天做的第一道题目,比较简单,无非就是重复调用。
加油吧!