《劍指Offer》第二版之合併兩個排序的鏈表(十二)

目錄


題目:
輸入兩個遞增排序的鏈表,合併這兩個鏈表並使新鏈表中的節點仍然是遞增排序的。例如,輸入鏈表1:1、3、5、7,鏈表2:2、4、6、8,則合併之後的升序鏈表如鏈表3:1、2、3、4、5、6、7、8所示。鏈表節點定義如下:
struct ListNode
{
	int value;
	ListNode next;
}

思路:
首先分析合併兩個鏈表的過程。我們分析合併兩個鏈表的頭節點開始。鏈表1的頭節點的值小於鏈表2的頭節點的值,因此鏈表1的頭節點將是合併後鏈表的頭節點。
我們繼續合併兩個鏈表中剩餘的節點。在兩個鏈表中剩下的節點依然是排序的,因此合併這兩個鏈表的步驟和前面的步驟是一樣的。我們還是比較兩個頭節點的值。此時鏈表2的頭節點的值小於鏈表1的頭節點的值,因此鏈表2的頭節點的值將是合併剩餘節點得到的鏈表的節點。我們把這個節點和前面合併鏈表時得到的鏈表的尾節點鏈接起來。
當我們得到兩個鏈表中值較小的頭節點並把它鏈接到已經合併的鏈表之後,兩個鏈表剩餘的節點依然是排序的,因此合併的步驟和之前的步驟是一樣的。這就是典型的遞歸過程,我們可以定義遞歸函數完成這一合併過程。
步驟:

代碼:
package test;

public class ListNodeMerge {

	public static void main(String[] args) {
		ListNode ln1 = new ListNode();
		ListNode ln2 = new ListNode();
		ListNode ln3 = new ListNode();
		ListNode ln4 = new ListNode();
		ln1.value = 1;
		ln1.next = ln2;
		ln2.value = 3;
		ln2.next = ln3;
		ln3.value = 5;
		ln3.next = ln4;
		ln4.value = 7;
		
		ListNode ln5 = new ListNode();
		ListNode ln6 = new ListNode();
		ListNode ln7 = new ListNode();
		ListNode ln8 = new ListNode();
		ln5.value = 2;
		ln5.next = ln6;
		ln6.value = 4;
		ln6.next = ln7;
		ln7.value = 6;
		ln7.next = ln8;
		ln8.value = 8;
		
		ListNode listNode = merge(ln1, ln5);
		while(listNode != null) {
			System.out.println(listNode.value);
			listNode = listNode.next;
		}
	}
	
	public static ListNode merge(ListNode pHead1, ListNode pHead2) {
		if (pHead1 == null)
			return pHead2;
		else if (pHead2 == null)
			return pHead1;
		
		ListNode pMergedHead = null;
	
		if(pHead1.value < pHead2.value) {
			pMergedHead = pHead1;
			pMergedHead.next = merge(pHead1.next, pHead2);
		} else {
			pMergedHead = pHead2;
			pMergedHead.next = merge(pHead1, pHead2.next);
		}
		
		return pMergedHead;
	}
	
	static class ListNode {
		int value;
		ListNode next;
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章