【劍指Offer】16、合並兩個排序的鏈表


  題目描述:

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

  解題思路:

  首先需要判斷幾個特殊情況,即判斷輸入的兩個指針是否為空。如果第一個鏈表為空,則直接返回第二個鏈表;如果第二個鏈表為空,則直接返回第一個鏈表。如果兩個鏈表都是空鏈表,合並的結果是得到一個空鏈表。

  兩個鏈表都是排序好的,我們只需要從頭遍歷鏈表,判斷當前指針,哪個鏈表中的值小,即賦給合並鏈表指針,剩余的結點仍然是排序的,所以合並的步驟和之前是一樣的,所以這是典型的遞歸過程,用遞歸可以輕松實現。

  舉例:

  編程實現(Java):

    //方法一:遞歸實現
    public ListNode Merge(ListNode list1,ListNode list2) {
   	if(list1==null)
            return list2;
        if(list2==null)
            return list1;
        ListNode head=null;    //頭節點
        if(list1.val<=list2.val){
            head=list1;
            head.next=Merge(list1.next,list2);
        }else{
            head=list2;
            head.next=Merge(list1,list2.next);
        }
        return head;
    }

    //方法二:非遞歸實現
    public ListNode Merge(ListNode list1,ListNode list2) {
    	if(list1==null)
            return list2;
        if(list2==null)
            return list1;
        ListNode head=new ListNode(-1);//頭節點
        ListNode thehead=head;
        while(list1!=null && list2!=null){
            if(list1.val<=list2.val){
                thehead.next=list1;
                list1=list1.next;
            }else{
                thehead.next=list2;
                list2=list2.next;
            }
            thehead=thehead.next;
        }
        if(list1!=null)  //歸並完需要檢查哪個鏈表還有剩余
            thehead.next=list1;
        if(list2!=null)
            thehead.next=list2;
        return head.next;
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM