一、题目描述
将两个升序链表合并为一个新的 升序 链表并返回。
新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
二、思路分析
两个升序的链表,自然而然的就能想到去比较它门链头的值,然后依次获取当前最小的节点组成一个新的的链表。
使用双指针变量两个升序链表,初始的时候指针 1 指向链表的表头,指针 2 指向链表 2 的表头。
然后判断它们的值,假如指针 1 的值小于或等于指针 2 的值,那么就把指针 1 的取出放到新的链表的 next 中,指针 1 指向当前节点的 next。
然后开始新的一轮比较,直到其中一个的 next 为 null ,那么就把剩下的那个链表直接添加到新的链表并返回当中即可。
如果两个链表的 next 都为 null 了,那么直接返回新的链表即可。
三、AC 代码
方法 1: 迭代版
var mergeTwoLists = function(l1, l2) {
const head = new ListNode()
let p = head
while(l1 && l2) {
if(l1.val <= l2.val) {
p.next = l1
l1 = l1.next
} else {
p.next = l2
l2 = l2.next
}
p = p.next
}
if(l1) p.next = l1
else p.next = l2
return head.next
}
方法 2: 递归版
var mergeTwoLists = function(l1, l2) {
const head = new ListNode()
let p = head
const callback = (p1, p2) => {
if(p1 && p2) {
if(p1.val <= p2.val) {
p.next = p1
p1 = p1.next
} else {
p.next = p2
p2 = p2.next
}
p = p.next
callback(p1, p2)
} else if(p1) {
p.next = p1
} else {
p.next = p2
}
}
callback(l1, l2)
return head.next
}
四、总结
主要就是链表的遍历和了解链表的数据结构和升序排序的特点。
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情