一.题目
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 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
均按 非递减顺序 排列
二.解题思路及代码
第一种,迭代法。创建一个新的ListNode节点resurlt,用来返回最终结果,再引入一个ListNode节点cur,用于变换链表的指向。将L1和L2进行比较,谁小cur.next就指向谁,然后cur和本次比较中值小的链表节点都指向自己的next节点。直到其中一个链表遍历结束。最后判断哪个链表还没遍历完,直接将cur指向没有遍历完的链表节点即可。代码如下:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
ListNode res=new ListNode();
ListNode cur=res;
while(list1!=null && list2!=null){
if(list1.val<list2.val){
cur.next=list1;
list1=list1.next;
cur=cur.next;
}
else{
cur.next=list2;
list2=list2.next;
cur=cur.next;
}
}
if(list1==null){
cur.next=list2;
}
if(list2==null){
cur.next=list1;
}
return res.next;
}
}
第二种,递归法。递归法比较巧妙,比较L1和L2的值,若L1的值小,那么下一步就是对除了L1.val之外的所有链表值进行问题解决。研究对象变成了ListNode mergeTwoLists(list1.next,list2)。非常简洁巧妙的思路。只是写代码时要注意,在一开头要判断L1和L2是否为null的情况,若为L1为null,直接返回L2,反之亦然。迭代法代码如下:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
if(list1==null){
return list2;
}
if(list2==null){
return list1;
}
if(list1.val<list2.val){
list1.next=mergeTwoLists(list1.next, list2);
return list1;
}
else{
list2.next=mergeTwoLists(list1, list2.next);
return list2;
}
}
}