1. 程式人生 > >演算法題006 -- [將兩個排序的連結串列合併,返回一個新連結串列,返回的新連結串列也是排好序的] by java

演算法題006 -- [將兩個排序的連結串列合併,返回一個新連結串列,返回的新連結串列也是排好序的] by java

題目

將兩個排序的連結串列合併,返回一個新連結串列,返回的新連結串列也是排好序的

程式碼

package algorithm6;

public class Algorithm6 {
	
	public static void main(String[] args) {
		ListNode merge = mergeListNodesBySelf(getListNode1(), getListNode4());
		System.out.println(merge.toString());;
	}
	
	/**方法一:不打算實現的方法
	 * 思路:第一反應的思路,就是利用一個數組
	 * 		分別遍歷兩個連結串列,將所有資料存放到陣列中
	 * 		然後再對陣列進行排序
	 * 		最後利用排好序的陣列,構建連結串列
	 * 
	 */
/**方法二: * 思路:合併兩個已經排序的連結串列,其實就是同時遍歷兩個連結串列 * 在遍歷連結串列的過程中,比較兩個連結串列當前節點的大小,並組成新的連結串列 * 那麼在遍歷的過程中,就需要有一個節點代表新的連結串列; * 還需要一個節點代表新連結串列將要被賦值的位置節點,這個節點是需要隨著遍歷而不斷更新,才能保證是最新位置 * 遍歷過程中,按照節點大小對比,判定需要前進的連結串列 * 優點:思路清晰簡單,時間複雜度自然就是 O(n) * * @param listNode1 * @param listNode2 * @return */
public static ListNode mergeListNodes(ListNode listNode1, ListNode listNode2) { if(listNode1 == null) return listNode2; if(listNode2 == null) return listNode1; ListNode pointer = new ListNode(0); ListNode head = pointer; while(listNode1 != null && listNode2 != null) { if(listNode1.
content < listNode2.content) { pointer.next = listNode1; pointer = pointer.next; listNode1 = listNode1.next; }else { pointer.next = listNode2; pointer = pointer.next; listNode2 = listNode2.next; } } if(listNode1 == null && listNode2!= null) { pointer.next = listNode2; } if(listNode2 == null&& listNode1!= null) { pointer.next = listNode1; } return head.next; } /**方法三: * 思路:遞迴,一種思路清晰,但是編碼卻有一定難度的解法 * 對兩個連結串列的節點做比較,返回較小的節點,再為該節點的next節點賦值; * 所謂賦值就是,將較小的連結串列推進一位,在與另外一個連結串列節點繼續比較; * 最終遍歷完兩個連結串列的所有節點,程式自然也就結束了 * 優點:思路清晰,時間複雜度依然是 O(n) * * @param listNode1 * @param listNode2 * @return */ public static ListNode mergeListNodesBySelf(ListNode listNode1, ListNode listNode2) { if(listNode1 == null) return listNode2; if(listNode2 == null) return listNode1; ListNode head = null; if(listNode1.content < listNode2.content) { head = listNode1; head.next = mergeListNodesBySelf(listNode1.next, listNode2); }else { head = listNode2; head.next = mergeListNodesBySelf(listNode1, listNode2.next); } return head; } public static ListNode getListNode1() { ListNode listNode1 = new ListNode(1); ListNode listNode3 = new ListNode(3); ListNode listNode5 = new ListNode(5); ListNode listNode7 = new ListNode(7); ListNode listNode9 = new ListNode(9); ListNode listNode12 = new ListNode(12); listNode1.next = listNode3; listNode3.next = listNode5; listNode5.next = listNode7; listNode7.next = listNode9; listNode9.next = listNode12; return listNode1; } public static ListNode getListNode2() { ListNode listNode2 = new ListNode(2); ListNode listNode4 = new ListNode(4); ListNode listNode6 = new ListNode(6); ListNode listNode8 = new ListNode(8); ListNode listNode10 = new ListNode(10); listNode2.next = listNode4; listNode4.next = listNode6; listNode6.next = listNode8; listNode8.next = listNode10; return listNode2; } public static ListNode getListNode3() { return null; } public static ListNode getListNode4() { ListNode listNode2 = new ListNode(1); ListNode listNode4 = new ListNode(4); ListNode listNode8 = new ListNode(8); ListNode listNode10 = new ListNode(13); listNode2.next = listNode4; listNode4.next = listNode8; listNode8.next = listNode10; return listNode2; } }