将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
示例 2:
输入:l1 = [], l2 = []
输出:[]
示例 3:
输入:l1 = [], l2 = [0]
输出:[0]
提示:
两个链表的节点数目范围是 [0, 50]
-100 <= Node.val <= 100
l1 和 l2 均按 非递减顺序 排列
代码示例一:
//本题采用递归的方法 class Solution { public ListNode mergeTwoLists(ListNode list1, ListNode list2) { //递归的出口 if(list1 == null){ return list2; } if(list2 == null){ return list1; } //1 -> 3 -> 5 -> null; //2 -> 4 -> 6 -> 8-> null; if(list1.val > list2.val){ //改变较小数的指向 //本链表的下一个节点和另外一链表函数调用的返回值 list2.next = mergeTwoLists(list1,list2.next); //将较小数进行返回 return list2; }else{ //同理 list1.next = mergeTwoLists(list1.next,list2); return list1; } } }
感觉刚开始学习递归有点抽象,但是用多了就感觉还不错。
代码示例二:
class Solution {
public ListNode mergeTwoLists(ListNode p1, ListNode p2) {
ListNode s = new ListNode(-1,null);
ListNode p = s;
//三条链表的初始状态
//p1
//1 -> 2 -> 4 ->null
//p2
//1 -> 3 -> 4 ->null
//p
//s -> null
while(p1 != null && p2 != null){
if(p1.val > p2.val){
//改变p的指向
p.next = p2;
//移动p2
p2 = p2.next;
}else {
//改变p的指向
p.next = p1;
//移动p1
p1 = p1.next;
}
//移动p
p = p.next;
}
//代码到这p1或p2 等于 null
//此时只需使p指向非空的链表即可
if(p1 != null){
p.next = p1;
}
if(p2 != null){
p.next = p2;
}
return s.next;
}
}
这种方法比较好理解,你需要跟着我的思路画草图应该就明白了。