将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
输入: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 均按 非递减顺序 排列
第一种:
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
ListNode prehead = new ListNode(0); // 创建一个虚拟头节点
ListNode pre = prehead; // 用来记录当前节点的前一个节点
// 当两个链表都不为空时进行循环比较
while (list1 != null && list2 != null) {
if (list1.val <= list2.val) { // 如果list1的值小于等于list2的值
pre.next = list1; // 将pre的下一个节点指向list1
list1 = list1.next; // 将list1指向下一个节点
} else { // 如果list2的值小于list1的值
pre.next = list2; // 将pre的下一个节点指向list2
list2 = list2.next; // 将list2指向下一个节点
}
pre = pre.next; // 将pre指向当前节点
}
// 将剩余未比较的链表部分连接到合并后的链表的尾部
pre.next = list1 == null ? list2 : list1;
return prehead.next; // 返回合并后的链表的头节点
}
第二种:递归
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
//如果list1为空,则返回 list2。
if(list1==null)
return list2;
//如果 list2 为空,则返回list1。
if(list2==null)
return list1;
//如果list1的值小于等于list2的值,则将 list1.next 指向递归调用 mergeTwoLists(list1.next, list2)的结果,并返回 list1
if(list1.val <= list2.val){
list1.next = mergeTwoLists(list1.next,list2);
return list1;
}else{
list2.next = mergeTwoLists(list1,list2.next);
return list2;
}
}