一、題目
輸入兩個單調遞增的鏈表,輸出兩個鏈表合成後的鏈表,當然我們需要合成後的鏈表滿足單調不減規則。
二、分析
- 如果鏈表1爲空,將輸出鏈表2;
- 如果鏈表2爲空,將輸出鏈表1;
- 如果鏈表1和鏈表2都不爲空,則比較指向鏈表1和鏈表2的節點值,如果指針1的節點值小於指針2的節點值,則將輸出鏈表的指針指向指針1;反之則將輸出鏈表的指針指向指針2;
- 當鏈表1再次爲空時,將輸出鏈表指向指針2;
- 當鏈表2再次爲空時,將輸出鏈表指向指針1;
三、代碼實現
/*
* 題目:
* 輸入兩個單調遞增的鏈表,輸出兩個鏈表合成後的鏈表,當然我們需要合成後的鏈表滿足單調不減規則。
*/
public class Test17 {
public ListNode Merge(ListNode list1,ListNode list2) {
if(list1 == null){
return list2;
}
if(list2 == null){
return list1;
}
ListNode head = null;
//確定輸出鏈表的頭結點
if(list1.value < list2.value){
head = list1;
list1 = list1.next;
}else{
head = list2;
list2 = list2.next;
}
ListNode temp = head;
while(list1 != null && list2 != null){
if(list1.value < list2.value){
temp.next = list1;
temp = temp.next;
list1 = list1.next;
}else{
temp.next = list2;
temp = temp.next;
list2 = list2.next;
}
}
if(list1 == null){
temp.next = list2;
}
if(list2 == null){
temp.next = list1;
}
return head;
}
}
四、遞歸實現
//遞歸實現
public ListNode Merge2(ListNode list1,ListNode list2) {
if(list1 == null){
return list2;
}
if(list2 == null){
return list1;
}
ListNode head = null;
if(list1.value < list2.value){
head = list1;
head.next = Merge2(list1.next, list2);
}else{
head = list2;
head.next = Merge2(list1, list2.next);
}
return head;
}
public void display(ListNode head){
if(head == null){
return;
}
ListNode temp = head;
while(temp != null){
System.out.print(temp.value+",");
temp = temp.next;
}
}