题目
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 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 均按非递减顺序排列
思路1
在不新增节点的前提下,拆散原来两个小链表,而后拼接新链表的l1,l2,last。

代码1
/**
* 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) {
//先判断边界条件
if(list1 == null) {
return list2;
}
if(list2 == null) {
return list1;
}
//这两个分支包含3种情况:l1空,l2不空;l1不空,l2空;l1空,l2空。
//此时l1和l2都不为空
ListNode dummyHead = new ListNode(-1);
//尾插
ListNode last = dummyHead;
while(list1 != null && list2 != null) {
if(list1.val <= list2.val) {
last.next = list1;
last = list1;
list1 = list1.next;
} else {
last.next = list2;
last = list2;
list2 = list2.next;
}
}
//此时说明l1或l2为空
if(list1 == null) {
last.next = list2;
}
if(list2 == null) {
last.next = list1;
}
return dummyHead.next;
}
}
思路2:递归
代码2
/**
* 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) {
if(list2 == null) {
return list1;
}
if(list1 == null) {
return list2;
}
if(list1.val < list2.val) {
list1.next = mergeTwoLists(list1.next, list2);
return list1;
} else {
list2.next = mergeTwoLists(list1, list2.next);
return list2;
}
}
}
该文介绍了如何合并两个已排序的链表,方法包括不使用额外节点的迭代法和使用递归的方法,确保合并后的链表仍然保持升序排列。
512

被折叠的 条评论
为什么被折叠?



