1. 程式人生 > >JAVA實現合併兩個排序的連結串列(《劍指offer》)

JAVA實現合併兩個排序的連結串列(《劍指offer》)

題目描述

輸入兩個單調遞增的連結串列,輸出兩個連結串列合成後的連結串列,當然我們需要合成後的連結串列滿足單調不減規則。 解答:
/*
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 list0=null;//定義一個連結串列作為返回值
        if(list1.val<list2.val){//判斷此時的值,如果list1比較小,就先把list1賦值給list0,反之亦然
           list0=list1;
           list0.next=Merge(list1.next, list2);//做遞迴,求連結串列的下一跳的值
           }
           else{
           list0=list2;
           list0.next=Merge(list1, list2.next);
           }
 return list0;
    }
}
簡化一下,用那個三目運算子:
public class Solution {
    public ListNode Merge(ListNode list1,ListNode list2) {
        if(list1==null)
            return list2;
        if(list2==null)
            return list1;
        ListNode head;
list0= list1.val>list2.val?list2:list1;
list0.next = list1.val>list2.val?Merge(list1,list2.next):Merge(list1.next,list2);
return list0; 
}
}


據說這道題面試的時候經常考,因為它跟斐波那契數列問題一樣有遞迴和非遞迴兩種解法,上面說了遞迴的解法,下面再來講下非遞迴的解法:
/*
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 tmp1 = list1;
            ListNode tmp2 = list2;
            ListNode head = new ListNode(0);//這裡不能把返回連結串列賦值為null,因為下一行馬上就要把它賦值給另一連結串列,得讓它在記憶體裡有位置才行
            ListNode headptr = head;
            while(tmp1 != null && tmp2!=null){             
                   
                    if(tmp1.val <= tmp2.val)
                    {
                        head.next=tmp1;
                        head = head.next;
                        tmp1 = tmp1.next;
                    }else{
                        head.next=tmp2;
                        head = head.next;
                        tmp2=tmp2.next;
                    }
                     
            }
             //其中一個連結串列已經跑到頭之後,繼續單鏈表的合併
            while(tmp1 != null){
                head.next = tmp1;
                head = head.next;
                tmp1= tmp1.next;
            }
            while(tmp2 != null){
                head.next = tmp2;
                head = head.next;
                tmp2= tmp2.next;
            }
            head = headptr.next;
            return head;
             
       
             
    }
}