21. 合并两个有序链表
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4
1.迭代
th:主要是通过定义一个head节点 遍历两个链表就可以,最后一定会有一个链表没有遍历完 使用三目运算符进行算
需要注意的点 因为head节点一直next next下去 所以应该定义一个root节点 作为根节点 head节点 一直next下去。返回的是root节点
time:O(m+n)
space:O(1)
/*
*思路 主要是通过定义一个head节点 遍历两个链表就可以,最后一定会有一个链表没有遍历完 使用三目运算符进行算
notice 因为head节点一直next next下去 所以应该定义一个root节点 作为根节点 head节点 一直next下去。返回的是root节点
*/
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1 == null || l2 == null){
return null;
}
ListNode root = new ListNode(-1);
ListNode head = root;
while(l1!=null && l2!= null){
if(l1.val <= l2.val){
head.next = l1;
l1 = l1.next;
}else{
head.next = l2;
l2 = l2.next;
}
head = head.next;
}
head.next = (l1 == null ? l2 : l1);
return root.next;
}
2.递归
th:其实如果一个方法可以迭代就可以递归解决,但是递归代码虽然简洁 理解上比较难一些,递归代码无非就是 三点需要注意:1 终止条件 2. 业务逻辑 3.解决下一个子问题 也就是 调用自身。
time:O(m+n)
space:调用 mergeTwoLists 退出时 l1 和 l2 中每个元素都一定已经被遍历过了,所以 n + mn+m 个栈帧会消耗 O(n + m)O(n+m) 的空间。
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;
}
}