解法1:迭代
时间O(M+N) MN为链表长度,空间O(1)
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
//边界判断
if(l1==null)
return l2;
if(l2==null)
return l1;
ListNode head=new ListNode();
ListNode rear=head;
while(l1!=null&&l2!=null)
{
if(l1.val>l2.val)
{
rear.next=l2;
l2=l2.next;
}
else
{
rear.next=l1;
l1=l1.next;
}
rear=rear.next;
}
//链表未合并完
if(l1==null)
{
rear.next=l2;
}
if(l2==null)
{
rear.next=l1;
}
return head.next;
}
}
解法2:递归
递归简洁但不容易理解:
三要素:
1、什么时候终止
2、递归公式
3、递归公式最后做什么,返回值【看最后一次递归返回什么】
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1==null)
return l2;
if(l2==null)
return l1;
if(l1.val>l2.val)
{
l2.next=mergeTwoLists(l1,l2.next);
return l2;
}
else
{
l1.next=mergeTwoLists(l1.next,l2);
return l1;
}
}
}
时间O(M+N),空间【递归栈】O(M+N)