将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 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
均按 非递减顺序 排列
解题思路:
- 首先理解题目要求,需要将两个升序排列的链表合并为一个新的升序链表。为了方便构建合并后的链表,创建一个虚拟头节点
dummyHead
。这样可以避免处理头节点为空的特殊情况,使得代码逻辑更加简洁。 - 使用一个指针
cur
从虚拟头节点开始,逐步构建合并后的链表。 - 通过一个循环同时遍历两个输入链表
l1
和l2
,比较它们当前节点的值。- 如果
l1
的当前节点值小于等于l2
的当前节点值,将l1
的节点连接到cur
的后面,并将l1
指针向前移动一位。否则,将l2
的节点连接到cur
的后面,并将l2
指针向前移动一位。 - 每次连接后,将
cur
指针也向前移动一位,准备连接下一个节点。
- 如果
- 当循环结束,即其中一个链表遍历完,使用三元运算符简洁地将另一个未遍历完的链表直接连接到
cur
的后面。 - 最后返回虚拟头节点的下一个节点,即合并后的链表的头节点。
代码附上:
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode dummyHead = new ListNode(-1);
ListNode cur = dummyHead;
while (l1!= null && l2!= null) {
if (l1.val <= l2.val) { // 这里使用 <= 可以处理相等值的情况
cur.next = l1;
l1 = l1.next;
} else {
cur.next = l2;
l2 = l2.next;
}
cur = cur.next;
}
cur.next = l1 == null? l2 : l1; // 直接使用三元运算符简洁地处理剩余链表的连接
return dummyHead.next;
}
}