/**
* 兩個有序鏈表合併
* Author : BlueSky 2019.10.29
* Function : 兩個有序鏈表合併爲一個新的有序鏈表並返回
* Example:
* 輸入:1->2->4, 1->3->4
* 輸出:1->1->2->3->4->4
*
* 思路:遞歸
* 1、對特殊情況進行處理:Head1 爲空則返回 Head2 ,Head2 爲空則返回 Head1。
* 2、比較兩個鏈表的第一個結點,確定頭節點
* 3、頭結點確定後,繼續在剩下的結點中選出下一個結點去鏈接到第二步選出的結點後面
* 4、重複2、3步驟
*/
public class TwoLinkListMerge {
public static void main(String[] args) {
Node node1 = new Node();
Node node2 = new Node();
Node node3 = new Node();
Node node4 = new Node();
Node node5 = new Node();
Node node6 = new Node();
node1.setNext(node2);
node1.setData(1);
node2.setNext(node3);
node2.setData(2);
node3.setNext(null);
node3.setData(4);
node4.setNext(node5);
node4.setData(1);
node5.setNext(node6);
node5.setData(3);
node6.setNext(null);
node6.setData(4);
Node mergeNode = merge(node1, node4);
System.out.println("first node:" + mergeNode.getData());
while (true){
if(mergeNode == null){
break;
}
System.out.println("node:" + mergeNode.getData());
mergeNode = mergeNode.getNext();
}
}
public static Node merge(Node head1, Node head2){
Node newNode;
/*// 理論上不會這種條件
if(head1 == null && head2 == null){
return null;
}*/
// 邊界
if(head1 == null){
return head2;
}else if(head2 == null){
return head1;
}else {
// 判斷大小
if(head1.getData() >= head2.getData()){
// 新的鏈表頭指向最小的head
newNode = head2;
// 爲鏈表頭下一個節點重複執行以上步驟
newNode.setNext(merge(head1, head2.getNext()));
}else {
newNode = head1;
newNode.setNext(merge(head1.getNext(), head2));
}
}
System.out.println("newNode current:" + newNode.getData());
return newNode;
}
public static class Node {
private Integer data;
private Node next;
public Integer getData() {
return data;
}
public void setData(Integer data) {
this.data = data;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
}
}
數據結構和算法之兩個有序的鏈表合併
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.