java实现将两个有序链表合成一个新的有序链表

链表节点结构及方法:

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);
}

猜你喜欢

转载自blog.csdn.net/qq_37856300/article/details/84170148