题目描述
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
两个链表的节点数目范围是 [0, 50]
-100 <= Node.val <= 100
l1 和 l2 均按 非递减顺序 排列
题目链接
测试用例
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
输入:l1 = [], l2 = []
输出:[]
输入:l1 = [], l2 = [0]
输出:[0]
解题思路
- 循环遍历两个链表,将值较小的插入当前位置
解题代码
/**
* 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 listNewPre = new ListNode();
ListNode listNew = listNewPre;
while(list1!=null || list2!=null){
int val1 = list1!=null ? list1.val : 1000;
int val2 = list2!=null ? list2.val : 1000;
if(val1 < val2){
listNew.next = list1;
list1 = list1.next;
listNew = listNew.next;
}else{
listNew.next = list2;
list2 = list2.next;
listNew = listNew.next;
}
}
return listNewPre.next;
}
}
其他解法
参考网站
解题思路
- 若两个链表中有一个链表l1为空,返回另一个链表l2
- 退出递归的条件是两个链表均为空
- 否则
- 看当前两个链表l1、l2元素值的大小
- 若l1的元素值小,则l1的next等于合并(l1.next与l2)
- 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) {
//两个链表均为空是递归停止的条件
//其中一个链表为空,则返回另一个
if(list1 == null){
return list2;
}
else if(list2 == null){
return list1;
}
//两个链表都不为空
//返回链表值较小的那个,并让该链表的next等于其余节点的合并
else if(list1.val <= list2.val){
list1.next = mergeTwoLists(list1.next, list2);
return list1;
}
else{
list2.next = mergeTwoLists(list2.next, list1);
return list2;
}
}
}
反思
注意递归的应用,两者时间复杂度相同,但是递归消耗内存少,没用到额外的空间!