这是我参与11月更文挑战的第24天,活动详情查看:2021最后一次更文挑战
前言
关于 LeetCode 数组类型题目的相关解法,可见LeetCode 数组类型题目做前必看,分类别解法总结了题目,可以用来单项提高。觉得有帮助的话,记得多多点赞关注哦,感谢!
题目描述
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
示例 2:
输入:l1 = [], l2 = []
输出:[]
示例 3:
输入:l1 = [], l2 = [0]
输出:[0]
链接:leetcode-cn.com/problems/me…
题解
这道题是经典的链表合并题目。主要就是将两个有序数组合并为一个有序数组。链表题目我一般习惯于构造一个假的头部,这种方法往往能够通用化,而不必额外的考虑边界情况。
首先先构造一个新的头部 head, 然后我们循环比较 list1 和 list2 指针指向节点的数字的大小,如果 list1 指向的数字小,那么我们就将新头 head 的 next 指针指向 list1,否则指向 list2,这样就完成了一个节点的合并。然后更新 list1 / list2 的指针指向,更新头部指针的指向,继续比较。直到其中一个指针为空。
遍历到最后时,有可能存在一个链表遍历完了,另一个还没,所以我们最后要将新链表和没遍历完的链表链接起来。最后返回假头部的 next 节点,就是合并后的链表。
具体代码如下,时间复杂度为 O(m+n)
/**
* 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) {
// 构造一个假头部
let head = new ListNode(0)
let point = head
while (list1 && list2) {
if (list1.val < list2.val) {
point.next = list1
point = point.next
list1 = list1.next
} else {
point.next = list2
point = point.next
list2 = list2.next
}
}
if (list1) point.next = list1
if (list2) point.next = list2
return head.next
};