題目描述
輸入兩個單調遞增的鏈表,輸出兩個鏈表合成后的鏈表,當然我們需要合成后的鏈表滿足單調不減規則。
題目分析
假如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; } }
做題目的時候還是要訓練到位,建議先自己想,並且同時實現遞歸和非遞歸版本,因為
面試的時候一般都會考察。