輸入兩個單調遞增的鏈表,輸出兩個鏈表合成後的鏈表,固然咱們須要合成後的鏈表知足單調不減規則。java
遞歸版本指針
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; } }
非遞歸版本code
/** * 輸入兩個遞增排序的鏈表,合併這兩個鏈表並使新鏈表中的結點仍然是按照遞增排序的 * * @param head1 第一個有序鏈表 * @param head2 第二個有序鏈表 * @return 合併後的有序鏈表頭 */ public static ListNode merge(ListNode head1, ListNode head2) { // 若是第一個鏈表爲空,返回第二個鏈表頭結點 if (head1 == null) { return head2; } // 若是第二個結點爲空,返回第一個鏈表頭結點 if (head2 == null) { return head1; } // 建立一個臨時結點,用於添加元素時方便 ListNode root = new ListNode(); // 用於指向合併後的新鏈的尾結點 ListNode pointer = root; // 當兩個鏈表都不爲空就進行合併操做 while (head1 != null && head2 != null) { // 下面的操做合併較小的元素 if (head1.value < head2.value) { pointer.next = head1; head1 = head1.next; } else { pointer.next = head2; head2 = head2.next; } // 將指針移動到合併後的鏈表的末尾 pointer = pointer.next; } // 下面的兩個if有且只一個if會內的內容會執行 // 若是第一個鏈表的元素未處理完將其,接到合併鏈表的最後一個結點以後 if (head1 != null) { pointer.next = head1; } // 若是第二個鏈表的元素未處理完將其,接到合併鏈表的最後一個結點以後 if (head2 != null) { pointer.next = head2; } // 返回處理結果 return root.next;