輸入兩個單調遞增的鏈表,輸出兩個鏈表合成後的鏈表,固然咱們須要合成後的鏈表知足單調不減規則java
這道題用到了分治法的思想:將一個難以直接解決的大問題,分割成一些規模較小的相同問題,以便各個擊破,分而治之指針
主要思路是:兩個指針分別指向兩個鏈表,一開始是頭結點,而後比較結點大小,哪一個小則合併到第三個鏈表,並向前移動一個結點。若是一個鏈表已經遍歷完成,而另外一個鏈表還未遍歷完成,則將未遍歷完的剩餘元素合併到第三個鏈表,最後返回第三個鏈表的首結點code
普通的迭代版本遞歸
public class Solution { public ListNode Merge(ListNode list1,ListNode list2) { if(list1 == null) { return list2; } if(list2 == null) { return list1; } // 建立一個頭結點,用於產生鏈表 ListNode head = new ListNode(-1); ListNode cur = head; while(list1 != null && list2 != null) { if(list1.val >= list2.val) { // 將 list2 指向的結點連接到 cur 的 next 指針 cur.next = list2; // list2 指向下一個結點 list2 = list2.next; } else { // 將 list1 指向的結點連接到 cur 的 next 指針 cur.next = list1; // list1 指向下一個結點 list1 = list1.next; } cur = cur.next; } // 將 list1 或者 list2 剩下的部分連接到 cur 的後面 if(list1 == null) { cur.next = list2; } else if(list2 == null) { cur.next = list1; } return head.next; } }
不建立頭結點的方法io
public class Solution { public ListNode Merge(ListNode list1,ListNode list2) { if(list1 == null) { return list2; } if(list2 == null) { return list1; } // 頭結點指針 ListNode head = null; ListNode cur = null; while(list1 != null && list2 != null) { if(list1.val >= list2.val) { // 讓頭結點指向最小的元素 if(head == null) { head = cur = list2; } else { cur.next = list2; cur = cur.next; } list2 = list2.next; } else { if(head == null) { head = cur = list1; } else { cur.next = list1; cur = cur.next; } list1 = list1.next; } } if(list1 == null) { cur.next = list2; } else if(list2 == null) { cur.next = list1; } return head; } }
使用遞歸解法class
public class Solution { 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; } } }