问题
方法一:迭代拼接
依次比较头结点,将小的节点加入到结果中
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1 == null)
return l2;
if(l2 == null)
return l1;
ListNode head = new ListNode() , tmp = head;
while(l1 != null && l2 != null){
if(l1.val < l2.val){
tmp.next = l1;
tmp = l1;
l1 = l1.next;
}else {
tmp.next = l2;
tmp = l2;
l2 = l2.next;
}
}
if(l1 == null)
tmp.next = l2;
else if(l2 == null)
tmp.next = l1;
return head.next;
}
- 时间复杂度:需要遍历两个链表,复杂度为O(n+m),n和m分别为两个链表的长度
- 空间复杂度:使用的原node,不需要额外的空间,空间复杂度为O(1)
方法二:递归
链表问题使用递归的思路更容易解决,合并两个有序链表l1和l2,先取出两个头结点中小的节点(假设是l1的头结点),那么,只需要将l1除了头结点剩余的部分和l2合并,再将l1的头结点放到合并后的链表的首位即可。
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1 == null)
return l2;
if(l2 == null)
return l1;
if(l1.val < l2.val){
l1.next = mergeTwoLists(l1.next , l2);
return l1;
}
else {
l2.next = mergeTwoLists(l1,l2.next);
return l2;
}
}
- 时间复杂度:每次递归都会去掉一个节点,一共需要m+n次递归操作,需要时间复杂度为O(m+n)
- 空间复杂度:需要消耗递归栈所用的空间,其取决于递归的深度,为O(m+n)