解法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;//注意的是list2
}
else if(list2==null){
return list1;
}
else if(list1.val<=list2.val){
list1.next=mergeTwoLists(list1.next,list2);//递归
return list1;
}
else{
list2.next=mergeTwoLists(list2.next,list1);
return list2;
}
}
}
简洁版(复制力扣评论的 )
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1 == null) return l2;
if (l2 == null) return l1;
ListNode res = l1.val < l2.val ? l1 : l2;
res.next = mergeTwoLists(res.next, l1.val >= l2.val ? l1 : l2);
return res;
}
注意:
1.时间复杂度:O(n+m),空间复杂度O(n + m),m,n分别为链表长度。
执行用时: 0 ms
内存消耗: 41 MB
解法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 l1, ListNode l2) {
ListNode b=new ListNode();
ListNode a=b;//必须要有两个,b用于存储合并后的链表,a用于指向下一个更小的值。
while(l1!=null&&l2!=null){
if(l1.val<=l2.val){
a.next=l1;
l1=l1.next;
}
else{
a.next=l2;
l2=l2.next;
}
a=a.next;//指向下一个
}
if(l1==null){
a.next=l2;
}
else if(l2==null){
a.next=l1;
}
//a.next = l1 == null ? l2 : l1;
return b.next;
}
}
注意:
1.时间复杂度O(m+n),空间复杂度o(1)
执行用时: 0 ms
内存消耗: 41 MB
错误案例1:超时
原因:1.在第一个else时写错,应该是l2=l2.next,造成超时;
注意:1.必须返回b.next,返回b会报错,在创建b时可以括号内没有值。
2.后面两个if可以写为//a.next = l1 == null ? l2 : l1;
3.在while循环中必须有a=a.next