将两个有序链表合并为一个新的有序链表并返回。新链表是经过拼接给定的两个链表的全部节点组成的。 html
示例:node
输入:1 -> 2 -> 4 ,1 -> 3 -> 4算法
输出:1 -> 1 -> 2 -> 3 -> 4 -> 4spa
class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { //若是 l1 或者 l2 一开始就是 null ,说明不须要合并,因此咱们只须要返回非空链表
if(l1 == null) { return l2; } if(l2 == null) { return l1; } //若是11的val值更小,则将11.next与排序好的链表头相接,12同理
if(l1.val < l2.val) { l1.next = mergeTwoLists(l1.next, l2); //每一层调用都返回排序好的链表头
return l1; } else { l2.next = mergeTwoLists(l1, l2.next); return l2; } } }
咱们假设 l1
元素严格比 l2
元素少,咱们能够将 l2
中的元素逐一插入 l1
中正确的位置。3d
class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { //先初始化一个预先指针 prehead,该指针的下一个节点指向真正的头结点head,是用来定位头结点的
listnode prehead = new listnode(-1); listnode prev = prehead; //遍历列表l1和l2,直到所有遍历完毕
while (l1 != null && l2 != null) { if (l1.val <= l2.val) { //prev.next始终指向比较以后的那个小的,l2同理
prev.next = l1; //当前位置的l1后移一位
l1 = l1.next; } else { prev.next = l2; l2 = l2.next; } prev = prev.next; } //在循环终止的时候, l1 和 l2 至多有一个是非空的。 //须要将非空链表接在合并链表的后面,并返回合并链表。
prev.next = l1 == null ? l2 : l1; return prehead.next; } }
依次类推,最后:指针