将两个有序的链表合并为一个新链表,要求新的链表是通过拼接两个链表的节点来生成的。
法一:递归T(m+n)
解题思路:
1.终止条件:l1为空,返回l2,l2为空,返回l1
2.返回值:每一层调用都返回排序好的链表头
3.本级递归内容:如果 l1 的 val 值更小,则将 l1.next 与排序好的链表头相接,l2 同理
O(m+n),m 为 l1的长度,n 为 l2 的长度
class Solution {
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;
}
}
}
法二:迭代 T(n+m) O(1)
解题思路:
1.当 l1 和 l2 都不是空链表时,判断 l1 和 l2 哪一个链表的头节点的值更小,将较小值的节点添加到结果里,
2.当一个节点被添加到结果里之后,将对应链表中的节点向后移一位
3.终止条件:l1为空,返回l2,l2为空,返回l1
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
/**
*
* @param l1 ListNode类
* @param l2 ListNode类
* @return ListNode类
*/
public ListNode mergeTwoLists (ListNode l1, ListNode l2) {
ListNode prehead=new ListNode(-1);
ListNode pre=prehead;
while(l1!=null && l2!=null){
if(l1.val<=l2.val){
pre.next=l1;
l1=l1.next;
}else{
pre.next=l2;
l2=l2.next;
}
pre=pre.next;
}
pre.next=l1==null?l2:l1;
return prehead.next;
}
}