java之合并链表的两种方法

本文介绍了一种合并两个递增排序链表的方法,并保持新链表的递增排序特性。提供了两种实现方式,一种是非递归方法,另一种是递归方法。通过示例展示了如何创建链表、插入节点以及合并链表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序。链表的结构如下:

class LNode { // 单链表的存储结构
	int value;
	LNode next;

	public LNode() {
	}

	public LNode(int value) {
		this.value = value;
		this.next = null;
	}

	public LNode(int value, LNode next) {
		this.value = value;
		this.next = next;
	}
}
合并链表的两种方法:

package LinkList;

public class MergeMain {
	// public LNode head = new LNode();// 创建空的头节点

	public void insertHead(int value, LNode node) { // 插入节点,从头开始
		LNode link = new LNode(value); // 创建一个带value值的节点
		link.next = node.next;
		node.next = link;
	}

	// 方法一,不用递归
	public LNode Merge(LNode node1, LNode node2) {
		if (node1 == null)
			return node2;
		if (node2 == null)
			return node1;
		LNode p1 = node1.next;
		LNode p2 = node2.next;
		LNode p;
		p = node1;
		while (p1 != null && p2 != null) {
			if (p1.value <= p2.value) {
				p.next = p1;
				p = p1;
				p1 = p1.next;
			} else {
				p.next = p2;
				p = p2;
				p2 = p2.next;
			}
			if (p1 != null) {
				p.next = p1;
			}
			if (p2 != null) {
				p.next = p2;
			}
		}
		return node1;
	}

	public void print(LNode node) {
		LNode p = node;
		while (p != null) {
			System.out.print(p.value + " ");
			p = p.next;
		}
	}

	// 方法二,使用递归调用
	public LNode Merge1(LNode node1, LNode node2) {
		if (node1 == null)
			return node2;
		else if (node2 == null)
			return node1;

		LNode pMergeHead = null;
		if (node1.next.value < node2.next.value) {
			pMergeHead = node1;
			pMergeHead.next = Merge1(node1.next, node2);
		} else {
			pMergeHead = node2;
			pMergeHead.next = Merge1(node1, node2.next);
		}
		return pMergeHead;
	}

	public static void main(String[] args) {
		MergeMain mergeMain = new MergeMain();
		LNode node1 = new LNode();
		LNode node2 = new LNode();
		for (int i = 20; i > 0; i -= 2) {
			mergeMain.insertHead(i, node1);
		}

		System.out.println("打印链表1");
		mergeMain.print(node1.next);
		System.out.println();
		for (int i = 22; i > 0; i -= 3) {
			mergeMain.insertHead(i, node2);
		}
		System.out.println("打印链表2");
		mergeMain.print(node2.next);
		System.out.println();
		LNode node3 = new LNode();
		LNode node4 = new LNode();
		for (int i = 20; i > 0; i -= 2) {
			mergeMain.insertHead(i, node3);
		}

		System.out.println("打印链表1");
		mergeMain.print(node3.next);
		System.out.println();
		for (int i = 22; i > 0; i -= 3) {
			mergeMain.insertHead(i, node4);
		}
		System.out.println("打印链表2");
		mergeMain.print(node4.next);
		System.out.println();
		System.out.println("1--------使用方法1来合并链表---------------");
		LNode node = mergeMain.Merge(node1, node2);
		mergeMain.print(node.next);
		System.out.println();
		System.out.println("1--------使用方法2来合并链表---------------");
		LNode p = mergeMain.Merge(node3, node4);
		mergeMain.print(p.next);
		System.out.println();

	}

}

打印结果:

打印链表1
2 4 6 8 10 12 14 16 18 20 
打印链表2
1 4 7 10 13 16 19 22 
打印链表1
2 4 6 8 10 12 14 16 18 20 
打印链表2
1 4 7 10 13 16 19 22 
1--------使用方法1来合并链表---------------
1 2 4 4 6 7 8 10 10 12 13 14 16 16 18 19 20 22 
1--------使用方法2来合并链表---------------
1 2 4 4 6 7 8 10 10 12 13 14 16 16 18 19 20 22 





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值