题目
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 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均按 非递减顺序 排列
题解
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
ListNode dummy = new ListNode(-1);
ListNode cur = dummy;
while(list1 != null && list2 != null){
if(list1.val < list2.val){
cur.next = list1;
list1 = list1.next;
}else{
cur.next = list2;
list2 = list2.next;
}
cur = cur.next;
}
cur.next = list1 == null ? list2 : list1;
return dummy.next;
}
}
思路
- 创建一个虚拟头节点dummy,用来当新链表的开头,避免处理头节点为空的特殊情况。用一个指针
cur来遍历、拼接节点。 - 同时遍历
list1和list2:- 如果
list1.val < list2.val,把cur.next指向list1,然后list1 = list1.next - 否则,
cur.next指向list2,然后list2 = list2.next cur = cur.next,向后移动新链表指针
- 如果
- 循环结束:其中一个链表遍历完毕,把剩下未遍历完链表直接接在 cur 后面。
- 返回
dummy.next,就是合并后链表的真正头结点。
边界:链表为空(null)直接处理,不用额外开头 if,循环自动兼容。