21.合并两个有序链表
题目链接
方法一
- 算法小白比如我就会很直接想到创建一个新的链表来存放新排序的链表,两个旧链表的每个节点一个一个比较,其值较小者放入新的链表中;
- 时间复杂度O(m+n);
- 空间复杂度O(m+n);
- 特点:思路简单.
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
if(list1 == null) return list2;
if(list2 == null) return list1;
ListNode p = new ListNode();
ListNode temp=p;
while(list1 != null && list2 != null){
if(list1.val <= list2.val){
p.val=list1.val;
list1=list1.next;
ListNode q = new ListNode();
p.next = q;
p = p.next;
}
else if(list2.val < list1.val){
p.val=list2.val;
list2=list2.next;
ListNode q = new ListNode();
p.next = q;
p = p.next;
}
}
if(list2 != null){
p.val = list2.val;
p.next = list2.next;
}
else if(list1 != null){
p.val = list1.val;
p.next = list1.next;
}
return temp;
}
}
方法二
- 使用递归的方法,一直递归下去,元素进栈,直到碰到终止条件list1=null或者list2=null,再让逐个出栈;
- 时间复杂度O(m+n),因为比较了m+n次;
- 空间复杂度O(m+n),因为递归调用栈m+n次;
- 优点:结构清晰,可读性强;
- 缺点:并没有降低复杂度.
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
if(list1 == null) return 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(list1, list2.next);
return list2;
}
}
}