21 合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

class ListNode {
    int val;
    ListNode next;

    ListNode() {
    }

    ListNode(int val) {
        this.val = val;
    }

    ListNode(int val, ListNode next) {
        this.val = val;
        this.next = next;
    }
}
  1. 直接暴力组合节点,使用dummy节点避免第一个节点需要做特殊处理。其中一个链后续为空的时候,直接将另外一条链接在要返回的链后面。时间复杂度 \(O(m+n)\),空间复杂度 \(O(1)\)
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        ListNode dummy = new ListNode(-1);
        ListNode head = dummy;
        while (l1 != null && l2 != null) {
            if (l1 .val>l2.val) {
                head.next = l2;
                l2 = l2.next;
            }else{
                head.next = l1;
                l1 = l1.next;
            }
            head = head.next;
        }
        if (l1 == null){
            head.next = l2;
        }
        if (l2 == null){
            head.next = l1;
        }
        return dummy.next;
    }

  1. 重复的判断行为使用递归,即当前节点被确定后将其后续节点及另外一个链的节点作为参数递归调用方法。时间复杂度 \(O(m+n)\),空间复杂度 \(O(m+n)\)
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        if (l1 == null || l2 == null) {
            return l1 == null ? l2 : l1;
        }
        if (l1.val > l2.val) {
            l2.next = mergeTwoLists(l1, l2.next);
            return l2;
        } else {
            l1.next = mergeTwoLists(l1.next, l2);
            return l1;
        }
    }
posted @ 2020-11-20 09:31  PotatoTed  阅读(48)  评论(0)    收藏  举报