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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值