java實現將兩個有序連結串列合成一個新的有序連結串列
阿新 • • 發佈:2018-11-19
連結串列節點結構及方法:
public class Node
{
private Node next;
private Integer number;
Node(){}
Node(Integer number)
{
this.number=number;
next=null;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
public Integer getNumber() {
return number;
}
public void setNumber(Integer number) {
this.number = number;
}
}
使用陣列構建連結串列:
public static void getLink(int[] arr, Node node)
{
for(int i = 0; i < arr.length; i++)
{
node.setNumber(arr[i]);
node.setNext(new Node());
node = node.getNext();
}
}
合併連結串列演算法:
/**
* @param link1 第一個有序連結串列的頭節點
* @param link2 第二個有序連結串列的頭節點
* @param link3 合併成的新的有序連結串列的頭節點
*/
public static void mergeLink(Node link1, Node link2, Node link3)
{
if( (link2.getNumber() != null) && (link1.getNumber() == null || link1.getNumber() >= link2.getNumber()) )
{//如果第二個連結串列還有未合併的節點,並且第一個連結串列沒有待合併節點了或者第一個連結串列中的節點比第二個連結串列中的現在要合併進去的這個節點要大了,證明現在只能將第二個連結串列中的節點向新連結串列中合併,沒有第一個連結串列中節點的事了
link3.setNumber(link2.getNumber());//給新連結串列中的新節點賦要合併進去的第二個連結串列的節點的值
link3.setNext(new Node());//給新連結串列插入未賦值的新節點
link2 = link2.getNext();//第二個連結串列指標右移
link3 = link3.getNext();//新連結串列指標右移
mergeLink(link1, link2, link3);//再去判斷,然後進行合併操作
}
else if( (link1.getNumber() != null) && (link2.getNumber() == null || link2.getNumber() > link1.getNumber()) )
{//如果第一個連結串列還有未合併的節點,並且第二個連結串列沒有待合併節點了或者第二個連結串列中的節點比第一個連結串列中的現在要合併進去的這個節點要大了,證明現在只能將第一個連結串列中的節點向新連結串列中合併,沒有第二個連結串列中節點的事了
link3.setNumber(link1.getNumber());//給新連結串列中的新節點賦要合併進去的第一個連結串列的節點的值
link3.setNext(new Node());//給新連結串列插入未賦值的新節點
link1 = link1.getNext();//第一個連結串列指標右移
link3 = link3.getNext();//新連結串列指標右移
mergeLink(link1, link2, link3);//再去判斷,然後進行合併操作
}
else
{//兩個連結串列都已經沒有剩下的未合併的節點了,合併結束
System.out.println("==沒有了,結束啦!==");
}
}
遍歷連結串列並輸出:
public static void viewLink(Node link)
{
while(link.getNumber() != null)
{
System.out.println(link.getNumber());
link = link.getNext();
}
}
主方法呼叫:
public static void main(String[] args)
{
//任意輸入兩個連結串列的初始資料
int[] arr1 = {1,3,6,8,23,34,56,77,90};
int[] arr2 = {-90,34,55,79,87,98,123,234,567};
//建立三個連結串列的頭節點
Node link1 = new Node();
Node link2 = new Node();
Node link3 = new Node();
//給兩個連結串列賦初始資料
getLink(arr1,link1);
getLink(arr2,link2);
//合併連結串列
mergeLink(link1, link2, link3);
//遍歷新連結串列輸出
viewLink(link3);
}