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\) \(≤\) \(100\)
- \(l1\) 和 \(l2\) 均按 非递减顺序 排列
算法和思路
二路归并 \(O(n)\)
- 新建头部的保护结点 \(dummy\),设置 \(cur\) 指针指向 \(dummy\)。
- 若当前\(l1\)指针指向的结点的值 \(val\) 比 \(l2\) 指针指向的结点的值 \(val\) 小,则令 \(cur\) 的 \(next\) 指针指向 \(l1\),且 \(l1\) 后移;否则指向 \(l2\),且 \(l2\) 后移。
- 然后 \(cur\) 指针按照上一部设置好的位置后移。
- 循环以上步骤直到 \(l1\) 或 \(l2\) 为空。
- 将剩余的 \(l1\) 或 \(l2\) 接到 \(cur\) 指针后边。
时间复杂度:两个链表各遍历一次,所以时间复杂度为 \(O(n)\)。
代码