题目:
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例一:
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
链表节点的创建:
class ListNode{
int val;//节点值
ListNode next;//指向下一个节点的指针
//构造器
ListNode(){
}
ListNode(int val){
this.val = val;
}
ListNode(int val,ListNode next){
this.val = val;
this.next = next;
}
}
解法一:循环+双指针
执行时间 0ms 内存消耗40.6 MB
cclass Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1 == null) return l2;
if (l2 == null) return l1;
ListNode resultNode = new ListNode(0);
ListNode p = resultNode;
//l1和l2只要有一个为空跳出循环
while(l1 != null && l2 != null){
if(l1.val < l2.val){
p.next = l1;
l1 = l1.next;
}else{
p.next = l2;
l2 = l2.next;
}
p = p.next;
}
if(l1 != null){
p.next = l1;
}
if(l2 != null){
p.next = l2;
}
//resultNode节点第一个值不属于l1和l2两个链表,所以返回resultNode.next
return resultNode.next;
}
}
解法二: 递归方法
执行时间 0ms 内存消耗41MB
class Solution {
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;
}
l2.next = mergeTwoLists(l1,l2.next);
return l2;
}
}
思路:以示例一为例 ,演示递归步骤
第一步:
第二步:
第三步:
第四步:
第五步:
得出结果: