(非遞歸不懂)合併兩個排序的鏈表

輸入兩個單調遞增的鏈表,輸出兩個鏈表合成後的鏈表,固然咱們須要合成後的鏈表知足單調不減規則。java

遞歸版本指針

public ListNode Merge(ListNode list1, ListNode list2) {
    if (list1 == null)
        return list2;
    if (list2 == null)
        return list1;
    if (list1.val <= list2.val) {
        list1.next = Merge(list1.next, list2);
        return list1;
    } else {
        list2.next = Merge(list1, list2.next);
        return list2;
    }
}

非遞歸版本code

/**
     * 輸入兩個遞增排序的鏈表,合併這兩個鏈表並使新鏈表中的結點仍然是按照遞增排序的
     *
     * @param head1 第一個有序鏈表
     * @param head2 第二個有序鏈表
     * @return 合併後的有序鏈表頭
     */
    public static ListNode merge(ListNode head1, ListNode head2) {
        // 若是第一個鏈表爲空,返回第二個鏈表頭結點
        if (head1 == null) {
            return head2;
        }
        // 若是第二個結點爲空,返回第一個鏈表頭結點
        if (head2 == null) {
            return head1;
        }
        // 建立一個臨時結點,用於添加元素時方便
        ListNode root = new ListNode();
        // 用於指向合併後的新鏈的尾結點
        ListNode pointer = root;
        // 當兩個鏈表都不爲空就進行合併操做
        while (head1 != null && head2 != null) {
            // 下面的操做合併較小的元素
            if (head1.value < head2.value) {
                pointer.next = head1;
                head1 = head1.next;
            } else {
                pointer.next = head2;
                head2 = head2.next;
            }
            // 將指針移動到合併後的鏈表的末尾
            pointer = pointer.next;
        }
        // 下面的兩個if有且只一個if會內的內容會執行
        // 若是第一個鏈表的元素未處理完將其,接到合併鏈表的最後一個結點以後
        if (head1 != null) {
            pointer.next = head1;
        }
        // 若是第二個鏈表的元素未處理完將其,接到合併鏈表的最後一個結點以後
        if (head2 != null) {
            pointer.next = head2;
        }
        // 返回處理結果
        return root.next;
相關文章
相關標籤/搜索