合並兩個排序的鏈表


題目描述

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

題目分析  

  假如List1中的頭節點是小於List2中的,那么新的鏈表的頭節點必將是List1的頭節點, 同理對List2也一樣,那么在比較完頭節點之后,再將List1中的下一個節點再與List2中的頭節點比較, 同樣誰小誰進入新鏈表,然后再比較,直到兩個鏈表比較完,故可用非遞歸或遞歸兩種方式來做。

代碼如下:

(1)非遞歸思想

/*
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;
        }
        ListNode current = new ListNode(-1);//創建一個當前指針
        ListNode root = current;//頭結點
        while(list1 != null && list2 != null){//當兩個鏈表都不空時
            if(list2.val >= list1.val){//如果第二個鏈表當前的數值不小於第一個鏈表當前的數值
                current.next = list1;//將第一個鏈表的當前節點加入合並后的鏈表中
                current = list1;//當前指針后移
                list1 = list1.next;//第一個鏈表指針后移
            }else{
                current.next = list2;
                current = list2;
                list2 = list2.next;                
            }
        }
        if(list1 != null){
            current.next = list1;
        }
        if(list2 != null){
            current.next = list2;
        }
        return root.next;
    }
}

(2)遞歸思想

public class Solution {
    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;
    }
}

 做題目的時候還是要訓練到位,建議先自己想,並且同時實現遞歸和非遞歸版本,因為面試的時候一般都會考察。


免責聲明!

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



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