Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一.题目
21. 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 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均按 非递减顺序 排列
二、思路分析:
首先这道题目是关于链表的题目,但是类似于数组的排序题目,所以这道题我们可以采用双指针的方法进行求解,因为题目没有限制,所以我们就可以创建一个额外的空间来存储L1或者L2开始的较小值,随后进行不断的循环移动指针来循环操作直至结束,当循环结束的时候我们要注意L1或者L2中可能存在剩余的值,那么我们的结果ListNode数据结构的指针就要指向他们之中剩余的元素起始节点位置即完成操作。
第二种就是利用递归求解,递归的思路更简便直接返回L1和L2较小值再利用递归即可完成题目的要求。
三、代码:
第一种方法双指针:
var mergeTwoLists = function(l1, l2) {
let p1 = l1,p2 = l2
let tempnode = new ListNode(-1)
let p = tempnode
while(p1 != null && p2 != null){
if(p1.val > p2.val){
p.next = p2
p2 = p2.next
}else{
p.next = p1
p1 = p1.next
}
p = p.next
}
if(p1 != null){
p.next = p1
}
if(p2 != null){
p.next = p2
}
return tempnode.next
}
//处理剩余的节点
第二种方法递归
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
var mergeTwoLists = function(l1, l2) {
//运用递归
if(l1 == null) return l2;
if(l2 == null) return l1;
if(l1.val <= l2.val){
l1.next = mergeTwoLists(l1.next,l2);
return l1;
}else{
l2.next = mergeTwoLists(l1,l2.next);
return l2;
}
};
四、总结:
这种链表合并的题目大多有两种求法:双指针和递归的解法,但是使用双指针的思路需要注意每个指针的位置操作以及后续剩余节点元素的处理以及最后
return应该返回什么。