题目描述
- 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/71fbde2f07d1307aec9b27f890c9fe2b.png#pic_center)
-
迭代法
- 注意:设定一个哨兵节点l,可以让我们在最后比较容易地返回合并后的链表
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode l = new ListNode(-1);
ListNode l3 = l;
if(l1==null){
l3=l2;
return l3;
}
if(l2==null){
l3=l1;
return l3;
}
while(l1!=null&&l2!=null){
if(l1.val<=l2.val){
l3.next = l1;
l1=l1.next;
}
else{
l3.next=l2;
l2=l2.next;
}
l3=l3.next;
}
if(l1!=null){
l3.next=l1;
}
if(l2!=null){
l3.next=l2;
}
return l.next;
}
}
- 时间复杂度:O(m+n)
- 空间复杂度:O(1)
-
递归法
- 根本思想:两个链表头部值较小的一个节点与剩下其他元素进行合并操作
- 即每次递归返回一个当前最小的节点,当任一链表为空时,直接返回,程序结束。
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1==null){
return l2;
}else if(l2==null){
return l1;
}else{
if(l1.val<=l2.val){
l1.next=mergeTwoLists(l1.next,l2);
return l1;
}else{
l2.next=mergeTwoLists(l1,l2.next);
return l2;
}
}
}