演算法題006 -- [將兩個排序的連結串列合併,返回一個新連結串列,返回的新連結串列也是排好序的] by java
阿新 • • 發佈:2018-11-22
題目
將兩個排序的連結串列合併,返回一個新連結串列,返回的新連結串列也是排好序的
程式碼
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;
}
}