合并两个有序递增的链表,使得合并后新链表还是有序的

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jcm666666/article/details/52280623

合并两个有序递增的单链表,使得合并后,新链表也是递增有序的。这里分别使用循环、递归实现合并有序链表

循环实现链表合并和递归实现链表的合并如下所示:

package cn.edu.nwu.structs.linklist;
/**
 * @author jcm
 *
 *时间 2016年8月22日
 */
public class MergeLinkList {
	/**
	 * @author jcm
	 * @param firstNodeHead 第一个链表的头指针,且链表是有序递增的
	 * @param twoNodeHead 第二个链表的头指针,且链表是有序递增的
	 * @return 返回一个有序的新链表的头指针
	 */
	public static Node mergeLinkList(Node firstNodeHead,Node twoNodeHead){
		//不存在第一个链表或者不存在第二个链表时,分别返回链表
		if(firstNodeHead == null){
			return twoNodeHead;
		}else if(twoNodeHead == null){
			return firstNodeHead ;
		}
		//定义新链表的头指针和当前结点
		Node newNodeHead = null;
		Node currentNode = null;
		//第一次初始化新链表的头指针和新结点
		if(firstNodeHead.data < twoNodeHead.data){
			newNodeHead = firstNodeHead;
			currentNode = firstNodeHead;
			firstNodeHead = firstNodeHead.next;
		}else{
			newNodeHead = twoNodeHead;
			currentNode = twoNodeHead;
			twoNodeHead = twoNodeHead.next;
		}
		//遍历两个链表的结点,并且比较大小,如果哪个链表的结点值最小,则把小的链表值赋给新链表
		while(firstNodeHead != null && twoNodeHead != null){
			if(firstNodeHead.data < twoNodeHead.data){
				currentNode.next = firstNodeHead;
				currentNode = currentNode.next;
				firstNodeHead = firstNodeHead.next;
			}else{
				currentNode.next = twoNodeHead;
				currentNode = currentNode.next;
				twoNodeHead = twoNodeHead.next;
			}
		}
		//如果第一个链表还没有比较完,则直接把第一个链表的剩下结点直接赋值给新链表
		if(firstNodeHead != null){
			currentNode.next = firstNodeHead;
		}else{
			currentNode.next = twoNodeHead;
		}
		return newNodeHead;
	}
	/**
	 * @author jcm
	 * 递归实现两个有序链表的合并
	 * @param firstNodeHead 第一个链表的头指针,且链表是有序递增的
	 * @param twoNodeHead 第二个链表的头指针,且链表是有序递增的
	 * @return 返回一个有序的新链表的头指针
	 */
	public static Node mergeLinkListRecursion(Node firstNodeHead,Node twoNodeHead){
		if(firstNodeHead == null){
			return twoNodeHead;
		}else if(twoNodeHead == null){
			return firstNodeHead;
		}
		//定义一个新链表的头指针
		Node newNodeHead = null;
		if(firstNodeHead.data < twoNodeHead.data){
			newNodeHead = firstNodeHead;
			newNodeHead.next = mergeLinkListRecursion(firstNodeHead.next,twoNodeHead);
		}else{
			newNodeHead = twoNodeHead;
			newNodeHead.next = mergeLinkListRecursion(firstNodeHead,twoNodeHead.next);
		}
		return newNodeHead;
	}
}
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页