本文參考自《劍指offer》一書,代碼採用Java語言。html
更多:《劍指Offer》Java實現合集 java
輸入兩個遞增排序的鏈表,合併這兩個鏈表並使新鏈表中的結點仍然是按照遞增排序的。函數
遞歸實現:合併過程當中,每次都是從兩個鏈表中找出較小的一個來連接,所以能夠採用遞歸來實現:當任意一個鏈表爲null時,直接連接另外一個鏈表便可;其他狀況只須要在兩個鏈表中找出較小的一個結點進行連接,該結點的next值繼續經過遞歸函數來連接。測試
非遞歸實現:非遞歸實現比較容易想到,直接進行分狀況討論便可,要稍微注意下後面代碼中頭結點的賦值過程。this
測試算例 spa
1.功能測試(兩個鏈表有多個或一個結點;結點值相同、不一樣)code
2.特殊測試(任意一個或者兩個鏈表的頭結點爲null)htm
//題目:輸入兩個遞增排序的鏈表,合併這兩個鏈表並使新鏈表中的結點仍然是按 //照遞增排序的。 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.遞歸實現時,須要注意連接的問題。排序