合併兩個排序的鏈表19.21

題目描述

輸入兩個單調遞增的鏈表,輸出兩個鏈表合成後的鏈表,當然我們需要合成後的鏈表滿足單調不減規則。

解題過程:

遇到鏈表題,老是會有摳邊界的問題,臨場思路要是不清晰就會出問題,就這個問題,我做了以下的總結:

第1步:審清題目:合併後是有序的,而且兩個鏈表本身也是有序的

第2步:在邊界上摳不清楚,代碼冗餘度很高,分塊處理:

            1)把特殊情況拎出來先處理,像個數不到要求,null的這種

            2)把普通的情況及正常運行的情況做一個循環處理

            3)把邊界做一個總體處理

下面是我的解法

/*
public class ListNode {
    int val;
    ListNode next = null;
    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode Merge(ListNode list1,ListNode list2) {
               //1)特殊情況處理
        if(list1 == null && list2 == null)
            return null;
        else if(list1 == null)
            return list2;
        else if(list2 == null)
            return list1;
        //2)正常情況處理
        ListNode cur = new ListNode(0);
        ListNode list = cur;
        //只要出現一個是null就退出,臨界情況交給後面處理
        while(list1!=null && list2!=null){
            int x = list1.val;
            int y = list2.val;
            if(x>y){
                cur.next = new ListNode(y);
                list2 = list2.next; //list2繼續往後走,list1不動
            }
            else {
                cur.next = new ListNode(x);
                list1 = list1.next;
            }
            cur = cur.next;
           }
           //3)邊界情況部分處理
           //到臨界點,有一個是null或者兩個都是null
            if(list1!=null && list2==null)
                cur.next = list1;
            else if(list1==null && list2!=null)
                cur.next = list2;
            else if(list1==null && list2==null)
                cur.next = null;
            return list.next;
            }
          }

運行時間:28ms

佔用內存:9668k

 

大佬的遞歸做法,但我還是不太擅長遞歸,有時候想不明白。用的好,代碼清晰簡潔 ,用不好,自己被繞進去出不來,或者根本就進不去呵呵……

/*
public class ListNode {
    int val;
    ListNode next = null;
    ListNode(int val) {
        this.val = val;
    }
}*/
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;
         }
       }
}

運行時間:31ms

佔用內存:9316k

 

遞歸方法總結:

        用遞歸一定要找到出口,而且在你退出一個遞歸向上回溯的時候,一定要更新遞歸出口,這樣就很容易能找到頭緒了。

第一步:先找遞歸出口,抓住後放到函數開頭

第二步:使用函數開始往下遞歸過程,遇到出口,開始回溯

第三步:更新出口(這步最關鍵,記住,只要有了出口,一定要記得分析更新出口)

如果你們有什麼好的想法,歡迎與我交流分享,如果你覺得我的博文對你有益,希望不吝點贊哦 !

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章