题目描述
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 :
输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4]
来源:力扣(LeetCode)
链接:LeetCode
题目分析
(1)由于两个链表是有序的,因此逐一两个链表的结点对比就可以合并,时间复杂度为O(m+n);
(2)有迭代和递归两种方法;就迭代而言,主要是注意指针的链接,还要设置当前指针指向新链表的尾部,每次比较两个链表头部的结点值,从结点值小的链表上摘下一个结点加入到新链表尾部;
(3)当其中一个链表为空时,把另一个链表的所有节点加入新链表链尾即可。
(4)对于递归实现而言,问题可以分解为,摘下一个较小节点后,剩余部分的合并,比如当第一次比较l1的头结点值较小时,链表结构为l1->merge(l1->next,l2),以此进行递归,递归出口条件即当某个链表为空。
代码
class Solution { //迭代代码
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode head = new ListNode(-1);
ListNode cur = head;
while(l1!=null&&l2!=null){
if(l1.val<=l2.val){
cur.next=l1;
l1=l1.next;
}
else{
cur.next=l2;
l2=l2.next;
}
cur=cur.next; //cur要指向当前尾结点,因此要跟着向后走一步
}
if(l1!=null) cur.next=l1;
if(l2!=null) cur.next=l2;
return head.next;
}
}
class Solution { //递归代码
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;
}
}
}