21、合并两个有序链表
非递归:
创建一个新结点newHead,然后再创建一个副本tmpNode用于将l1和l2中的较小者插入到newHead中的尾部,然后l1与l2分别迭代比较,直到其中一个为null结束迭代。
最后注意返回的是newHead.next而不是newHead,合并的链表应该是newHead.next开始。
/**
* 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 l1, ListNode l2) {
ListNode newHead=new ListNode();
if(l1==null)
{
return l2;
}
if(l2==null)
{
return l1;
}
ListNode tmpNode=newHead;
while(l1!=null && l2!=null)
{
if(l1.val<l2.val)
{
tmpNode.next=l1;
tmpNode=tmpNode.next;
l1=l1.next;
}
else
{
tmpNode.next=l2;
tmpNode=tmpNode.next;
l2=l2.next;
}
}
if(l1==null)
{
tmpNode.next=l2;
}
else
{
tmpNode.next=l1;
}
return newHead.next;
}
}
递归:
新链表也不需要构造新节点,递归三个要素
-
终止条件: 两条链表分别名为 l1 和 l2,当 l1 为空或 l2 为空时结束
-
返回值:每一层调用都返回排序好的链表头
-
本级递归内容:如果 l1 的 val 值更小,则将 l1.next 与排序好的链表头相接,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 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;
}
else
{
l2.next=mergeTwoLists(l1,l2.next);
return l2;
}
}
}