单向链表合并

一、概述

二、代码

public class Link {
	public static void main(String[] args) {
		// 构造链表A
		LinkNode linkNodeA1 = new LinkNode(1);
		LinkNode linkNodeA2 = new LinkNode(3);
		LinkNode linkNodeA3 = new LinkNode(5);
		linkNodeA1.next = linkNodeA2;
		linkNodeA2.next = linkNodeA3;
		
		// 构造链表B
		LinkNode linkNodeB1 = new LinkNode(2); 
		LinkNode linkNodeB2 = new LinkNode(4);
		linkNodeB1.next = linkNodeB2;
		
		// 合并链表
		LinkNode linkNode = merge(linkNodeA1, linkNodeB1);
		System.out.println(linkNode.obj);
		while (null != linkNode.next) {
			linkNode = linkNode.next;
			System.out.println(linkNode.obj);
		}
	}
	
	/**
	 * 常规:按顺序合并链表
	 * @param ln1
	 * @param ln2
	 * @return
	 */
	public static LinkNode merge(LinkNode ln1, LinkNode ln2) {
		if(null == ln1) return ln2;
		if(null == ln2) return ln1;
		
		// 获取头结点
		LinkNode head = null;  
		if(ln1.obj <= ln2.obj) {
			head = ln1;
			ln1 = ln1.next;
		} else {
			head = ln2;
			ln2 = ln2.next;
		}
		// temp 指向每一次合并之后的最后一个结点:用于指定下一个结点
		LinkNode cur = head;
		while (null != ln1 && null != ln2) {
			if(ln1.obj <= ln2.obj) {
				cur.next = ln1;
				cur = ln1;
				ln1 = ln1.next;
			} else {
				cur.next = ln2;
				cur = ln2;
				ln2 = ln2.next;
			}
		}
		// 当其中一个链表为空时
		if(null == ln1) {
			cur.next = ln2;
		} else {
			cur.next = ln1;
		}
		return head;
	}
	
	/**
	 * 添加虚拟头结点:按顺序合并链表
	 * @param ln1
	 * @param ln2
	 * @return
	 */
	public static LinkNode merge2(LinkNode ln1, LinkNode ln2) {
		if(null == ln1) return ln2;
		if(null == ln2) return ln1;
		
		// 设置虚拟头结点
		LinkNode head = new LinkNode(10000);  
		// temp 指向每一次合并之后的最后一个结点:用于指定下一个结点
		LinkNode temp = head;
		while (null != ln1 && null != ln2) {
			if(ln1.obj <= ln2.obj) {
				temp.next = ln1;
				temp = ln1;
				ln1 = ln1.next;
			} else {
				temp.next = ln2;
				temp = ln2;
				ln2 = ln2.next;
			}
		}
		if(null == ln1) {
			temp.next = ln2;
		} else {
			temp.next = ln1;
		}
		return head.next;
	}
	
	/**
	 * 递归:按顺序合并链表
	 * @param ln1
	 * @param ln2
	 */
	public static LinkNode merge3(LinkNode ln1, LinkNode ln2) {
		if(null == ln1) return ln2;
		if(null == ln2) return ln1;
		
		if(ln1.obj <= ln2.obj) {
			ln1.next = merge3(ln1.next, ln2);
			return ln1;
		} else {
			ln2.next = merge3(ln1, ln2.next);
			return ln2;
		}
	}
	
	/**
	 * 单向链表node
	 * @author chenfenli
	 *
	 */
	static class LinkNode {
		// 数据
		public Integer obj;
		// 下一个结点
		public LinkNode next;
		
		public LinkNode(Integer obj) {
			super();
			this.obj = obj;
		}
	}
}

三、分析

  • 案例思路:
  1. 对比A链表和B链表的头结点的值,确定为合并之后的头结点(小的为头结点)。
  2. 按大小对比,遍历剩下的A链表和B链表对比。
  3. 当至少有一个链表遍历到尾部,做最后一次next赋值。
  4. 结束
  • 已常规:按顺序合并链表为列:

    1.获取头结点:

   

    2.遍历其它结点对比:

   

    3.B链表遍历到尾部,没有下一个结点时,最后一次next

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值