合併兩個排序的鏈表


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


這道題用到了分治法的思想:將一個難以直接解決的大問題,分割成一些規模較小的相同問題,以便各個擊破,分而治之指針

主要思路是:兩個指針分別指向兩個鏈表,一開始是頭結點,而後比較結點大小,哪一個小則合併到第三個鏈表,並向前移動一個結點。若是一個鏈表已經遍歷完成,而另外一個鏈表還未遍歷完成,則將未遍歷完的剩餘元素合併到第三個鏈表,最後返回第三個鏈表的首結點code


解法一

普通的迭代版本遞歸

public class Solution {
    public ListNode Merge(ListNode list1,ListNode list2) {
        if(list1 == null) {
            return list2;
        }
        if(list2 == null) {
            return list1;
        }
        // 建立一個頭結點,用於產生鏈表
        ListNode head = new ListNode(-1);
        ListNode cur = head;
        while(list1 != null && list2 != null) {
            if(list1.val >= list2.val) {
            	// 將 list2 指向的結點連接到 cur 的 next 指針
                cur.next = list2;
                // list2 指向下一個結點
                list2 = list2.next;
            } else {
            	// 將 list1 指向的結點連接到 cur 的 next 指針
                cur.next = list1;
                // list1 指向下一個結點
                list1 = list1.next;
            }
            cur = cur.next;
        }
        // 將 list1 或者 list2 剩下的部分連接到 cur 的後面
        if(list1 == null) {
            cur.next = list2;
        } else if(list2 == null) {
            cur.next = list1;
        }
        return head.next;
    }
}

解法二

不建立頭結點的方法io

public class Solution {
    public ListNode Merge(ListNode list1,ListNode list2) {
        if(list1 == null) {
            return list2;
        }
        if(list2 == null) {
            return list1;
        }
        // 頭結點指針
        ListNode head = null;
        ListNode cur = null;
        while(list1 != null && list2 != null) {
            if(list1.val >= list2.val) {
            	// 讓頭結點指向最小的元素
                if(head == null) {
                    head = cur = list2;
                } else {
                    cur.next = list2;
                    cur = cur.next;
                }
                list2 = list2.next;
            } else {
                if(head == null) {
                    head = cur = list1;
                } else {
                    cur.next = list1;
                    cur = cur.next;
                }
                list1 = list1.next;
            }
        }
        if(list1 == null) {
            cur.next = list2;
        } else if(list2 == null) {
            cur.next = list1;
        }
        return head;
    }
}

解法三

使用遞歸解法class

public class Solution {
    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;
        }        
    }
}
相關文章
相關標籤/搜索