【劍指Offer學習】【面試題17 ::合併兩個排序的連結串列】
阿新 • • 發佈:2019-02-06
題目:輸入兩個遞增排序的連結串列,合併這兩個連結串列並使新連結串列中的結點仍然是按照遞增排序的
連結串列結點定義如下:
public static class ListNode {
int value;
ListNode next;
}
解題思路:
見程式碼註釋
程式碼實現:
public class Test17 {
public static class ListNode {
int value;
ListNode next;
}
/**
* 輸入兩個遞增排序的連結串列,合併這兩個連結串列並使新連結串列中的結點仍然是按照遞增排序的
*
* @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;
}
/**
* 輸入兩個遞增排序的連結串列,合併這兩個連結串列並使新連結串列中的結點仍然是按照遞增排序的
* 【使用的是遞迴的解法,不推薦,遞迴呼叫的時候會有方法入棧,需要更多的記憶體】
*
* @param head1 第一個有序連結串列
* @param head2 第二個有序連結串列
* @return 合併後的有序連結串列頭
*/
public static ListNode merge2(ListNode head1, ListNode head2) {
// 如果第一個連結串列為空,返回第二個連結串列頭結點
if (head1 == null) {
return head2;
}
// 如果第二個連結串列為空,返回第一個連結串列頭結點
if (head2 == null) {
return head1;
}
// 記錄兩個連結串列中頭部較小的結點
ListNode tmp = head1;
if (tmp.value < head2.value) {
// 如果第一個連結串列的頭結點小,就遞迴處理第一個連結串列的下一個結點和第二個連結串列的頭結點
tmp.next = merge2(head1.next, head2);
} else {
// 如果第二個連結串列的頭結點小,就遞迴處理第一個連結串列的頭結點和第二個連結串列的頭結點的下一個結點
tmp = head2;
tmp.next = merge2(head1, head2.next);
}
// 返回處理結果
return tmp;
}
/**
* 輸出連結串列的元素值
*
* @param head 連結串列的頭結點
*/
public static void printList(ListNode head) {
while (head != null) {
System.out.print(head.value + "->");
head = head.next;
}
System.out.println("null");
}
public static void main(String[] args) {
ListNode head = new ListNode();
head.value = 1;
head.next = new ListNode();
head.next.value = 2;
head.next.next = new ListNode();
head.next.next.value = 3;
head.next.next.next = new ListNode();
head.next.next.next.value = 4;
head.next.next.next.next = new ListNode();
head.next.next.next.next.value = 5;
ListNode head2 = new ListNode();
head2.value = 1;
head2.next = new ListNode();
head2.next.value = 3;
head2.next.next = new ListNode();
head2.next.next.value = 5;
head2.next.next.next = new ListNode();
head2.next.next.next.value = 6;
head2.next.next.next.next = new ListNode();
head2.next.next.next.next.value = 7;
// head = merge(head, head2);
head = merge2(head, head2);
printList(head);
}
執行結果: