【Java】 劍指offer(25) 合併兩個排序的鏈表

本文參考自《劍指offer》一書,代碼採用Java語言。html

更多:《劍指Offer》Java實現合集  java

題目 

  輸入兩個遞增排序的鏈表,合併這兩個鏈表並使新鏈表中的結點仍然是按照遞增排序的。函數

思路

  遞歸實現:合併過程當中,每次都是從兩個鏈表中找出較小的一個來連接,所以能夠採用遞歸來實現:當任意一個鏈表爲null時,直接連接另外一個鏈表便可;其他狀況只須要在兩個鏈表中找出較小的一個結點進行連接,該結點的next值繼續經過遞歸函數來連接。測試

  非遞歸實現:非遞歸實現比較容易想到,直接進行分狀況討論便可,要稍微注意下後面代碼中頭結點的賦值過程。this

測試算例 spa

  1.功能測試(兩個鏈表有多個或一個結點;結點值相同、不一樣)code

  2.特殊測試(任意一個或者兩個鏈表的頭結點爲null)htm

Java代碼

//題目:輸入兩個遞增排序的鏈表,合併這兩個鏈表並使新鏈表中的結點仍然是按
//照遞增排序的。

public class MergeSortedLists {
	public class ListNode{
		int val;
		ListNode next=null;
		public ListNode(int val) {
			this.val=val;
		}		
	}
    
	/*
	 * 遞歸版本
	 */
    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;
    	}
    }
    
    /*
     * 非遞歸
     */
    public ListNode merge2(ListNode list1,ListNode list2) {
    	if(list1==null)	return list2;
    	if(list2==null)	return list1;
    	ListNode dummyHead=new ListNode(0);  //不能爲null
    	ListNode p=dummyHead;
    	while(list1!=null && list2!=null){
            if(list1.val<list2.val){
                p.next=list1;
                list1=list1.next;
            }else{
                p.next=list2;
                list2=list2.next;
            }
            p=p.next;
        }
    	if(list1==null)
    		p.next=list2;
    	else
    		p.next=list1;
    	return dummyHead.next;
    }
}

    

收穫

  1.遞歸仍是不夠熟悉,第一反應想到的仍是非遞歸實現。注意每次操做相同時,要當即考慮到能夠採用遞歸來進行實現。blog

  2.遞歸實現時,須要注意連接的問題。排序

  

更多:《劍指Offer》Java實現合集 

相關文章
相關標籤/搜索