将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
    示例:
    输入:1->2->4, 1->3->4
    输出:1->1->2->3->4->4
    法一:迭代
    (1) 取出两个链表值比较小的头节点,然后递归取出两个链表中值比较小的节点拼接。
    (2) 直至两个链表中所有节点都拼接完成返回值比较小的头节点。

    时间复杂度:O(n+m) ,其中 n 和 m 分别为两个链表的长度。因为每次循环迭代中,l1 和 l2 只有一个元素会被放进合并链表中, 因此 while 循环的次数不会超过两个链表的长度之和。所有其他操作的时间复杂度都是常数级别的,因此总的时间复杂度为 O(n+m)。
    空间复杂度:O(1)。我们只需要常数的空间存放若干变量。

    1. /**
    2. * Definition for singly-linked list.
    3. * public class ListNode {
    4. * int val;
    5. * ListNode next;
    6. * ListNode(int x) { val = x; }
    7. * }
    8. */
    9. class Solution {
    10. public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
    11. ListNode pre = new ListNode(0);
    12. ListNode head = pre;
    13. while (l1 != null && l2 != null) {
    14. if (l1.val < l2.val) {
    15. pre.next = l1;
    16. l1 = l1.next;
    17. } else {
    18. pre.next = l2;
    19. l2 = l2.next;
    20. }
    21. pre = pre.next;
    22. }
    23. if (l1 == null) pre.next = l2;
    24. if (l2 == null) pre.next = l1;
    25. return head.next;
    26. }
    27. }


    21. 合并两个有序链表(迭代,递归)2 - 图1
    法二:递归
    终止条件:两条链表分别名为 l1 和 l2,当 l1 为空或 l2 为空时结束
    返回值:每一层调用都返回排序好的链表头
    本级递归内容:如果 l1 的 val 值更小,则将 l1.next 与排序好的链表头相接,l2 同理
    时间空间复杂度:O(m+n),m为 l1的长度,n 为 l2 的长度

    1. /**
    2. * Definition for singly-linked list.
    3. * public class ListNode {
    4. * int val;
    5. * ListNode next;
    6. * ListNode(int x) { val = x; }
    7. * }
    8. */
    9. class Solution {
    10. public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
    11. if (l2 == null) return l1;
    12. if (l1 == null) return l2;
    13. if (l1.val < l2.val) {
    14. l1.next = mergeTwoLists(l1.next, l2);
    15. return l1;
    16. } else {
    17. l2.next = mergeTwoLists(l1, l2.next);
    18. return l2;
    19. }
    20. }
    21. }

    21. 合并两个有序链表(迭代,递归)2 - 图2