【笔试】35、合并两个排序的链表

/****************************************************************************************
 *题目:合并两个排序的链表
 *		输入两个递增排序的链表,合并这两个链表并使链表中的节点仍然是按照递增排序的。例如输入图3.7中的链表1和链表2,
 *		则合并之后的升序链表如链表3所示。
 *时间:2015年8月31日09:02:36
 *文件:MergeLink.java
 *作者:cutter_point
 ****************************************************************************************/
package bishi.Offer50.y2015.m08.d31;

import bishi.Offer50.y2015.m08.d26.*;

public class MergeLink
{
	/**
	 * 这里两个链表是开始就是数据的链表,也就是头不是一个不放数据的链表
	 * 有点类似数组第一个位置不放数据,从第1个位置开始一样,这里的参数就是第一个位置放数据的数组
	 * @param pHead1
	 * @param pHead2
	 * @return
	 */
	public LinkNode merge(LinkNode pHead1, LinkNode pHead2)
	{
		if(pHead1 == null)
			return pHead2;
		else if(pHead2 == null)
			return pHead1;
		
		//我们合并之后的链表头
		LinkNode pMergeHead = null;
		if(pHead1.m_nValue < pHead2.m_nValue)
		{
			//如果第一个链表的当前节点值不第二个小
			pMergeHead = pHead1;
			pMergeHead.m_pNext = merge(pHead1.m_pNext, pHead2);
		}//if
		else
		{
			//如果第一个链表的当前节点比第二个大的话
			pMergeHead = pHead2;
			pMergeHead.m_pNext = merge(pHead1, pHead2.m_pNext);
		}//else
		
		return pMergeHead;
	}
	
	/**
	 * 当我们的链表中的第一个节点是无用的只是用来做为一个头结点的时候
	 * @param pHead1
	 * @param pHead2
	 * @return
	 */
	public LinkNode mergeResult(LinkNode pHead1, LinkNode pHead2)
	{
		if(pHead1 == null || pHead1.m_pNext == null)
			return pHead2;
		else if(pHead2 == null || pHead2.m_pNext == null)
			return pHead1;
		
		LinkNode mergeResult = new LinkNode();
		mergeResult.m_pNext = merge(pHead1.m_pNext, pHead2.m_pNext);
		
		return mergeResult;
	}
	
	@org.junit.Test
	public void Test()
	{
		LinkList link = new LinkList();
		link.addTail(8);link.addTail(7);link.addTail(6);link.addTail(5);link.addTail(4);link.addTail(3);
		
		LinkList link2 = new LinkList();
		link.addTail(2);link.addTail(1);link.addTail(0);link.addTail(-1);link.addTail(-2);link.addTail(-3);
		
		MergeLink ml = new MergeLink();
		
		LinkNode head = ml.mergeResult(link.getHead(), link2.getHead());
		
		//逆序输出
		LinkList.PrintListReversingly_Recursively(head);
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值