将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4]
输入:l1 = [], l2 = [] 输出:[]
输入:l1 = [], l2 = [0] 输出:[0]
提示:
????
~~~~
???? 两个链表的节点数目范围是 [0, 50]
????
~~~~
???? -100 <= Node.val <= 100
????
~~~~
???? l1 和 l2 均按 非递减顺序 排列
嗐,真就是,困难题我唯唯诺诺,简单题我重拳出击。╮(╯▽╰)╭ 迭代法简单好写。 关于返回:初始化的节点默认val是0,所以要返回.next 。 写着写着好像明白了不用重新创建节点。。。直接用node就行。。。
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
ListNode result = new ListNode();
ListNode node = result;
while(list1 != null && list2 != null){
if(list1.val <= list2.val){
node.next = list1;
list1 = list1.next;
}
else{
node.next = list2;
list2 = list2.next;
}
node = node.next;
}
if(list1 == null){
while(list2 != null){
node.next = list2;
node = node.next;
list2 = list2.next;
}
}
if(list2 == null){
while(list1 != null){
node.next = list1;
node = node.next;
list1 = list1.next;
}
}
return result.next;
}
}
递归法也挣扎了一下。
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
return merge(list1,list2);
}
public ListNode merge(ListNode list1, ListNode list2){
if(list1 == null){
return list2;
}
else if(list2 == null) {
return list1;
}
if(list1.val <= list2.val){
list1.next = merge(list1.next,list2);
return list1;
}
else{
list2.next = merge(list1,list2.next);
return list2;
}
}
}
讲道理最坏情况下并不比暴力迭代性能优秀,而且空间复杂度反而会高。但也该练练递归。
|