輸入兩個單調遞增的鏈表,輸出兩個鏈表合成後的鏈表,固然咱們須要合成後的鏈表知足單調不減規則。java
思路一(迭代):this
思路二(遞歸):spa
package LinkedList; /** * 合併兩個排序的鏈表 * 輸入兩個單調遞增的鏈表,輸出兩個鏈表合成後的鏈表,固然咱們須要合成後的鏈表知足單調不減規則。 */ public class Solution39 { /** * 迭代 * * @param list1 * @param list2 * @return */ public ListNode Merge_2(ListNode list1, ListNode list2) { if (list1 == null && list2 == null) return null; 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) {//若是鏈表1的結點小於鏈表2的結點 cur.next = list1; list1 = list1.next; } else { cur.next = list2; list2 = list2.next; } cur = cur.next; } //把未結束的鏈表直接鏈接到合併鏈表的尾部 if (list1 != null) cur.next = list1; if (list2 != null) cur.next = list2; return head.next; } /** * 遞歸 * * @param list1 * @param list2 * @return */ public ListNode Merge(ListNode list1, ListNode list2) { if (list1 == null && list2 == null) return null; if (list1 == null) return list2; if (list2 == null) return list1; if (list1.val <= list2.val) {//若是鏈表1的結點小於等於鏈表2的結點 list1.next = Merge(list1.next, list2); return list1; } else { list2.next = Merge(list1, list2.next); return list2; } } public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } }