合并两个递增有序的单链表L1和L2并存储在链表L1中

本文介绍了一种快速合并两个已排序单链表的算法。通过比较两个链表节点的值,将较小的节点插入到结果链表中,直到一个链表的所有节点都被处理。该算法在合并过程中保持了链表的有序性,最终得到一个合并后的有序链表。

题目:
合并两个从小到大链表的链表,使用的算法越快越好。
比如:L1={1,3,5}, L2={2,4},
L1.merge(L2)后,L1={1,2,3,4,5}, L2={}
此博客实现的是无头结点的单链表合并的类型

public class Problem1 {
	public static void main(String[] args) {
		System.out.println("初始化L1和L2");
		int[] nums1 = {2,4},nums2 = {1,3,5};
		LinkNode L1 = new LinkNode(),L2 = new LinkNode();
		//初始化L2
		L2.val = nums2[0];
		LinkNode p1 = L2;
		for(int i=1; i < 3; i++) {
			LinkNode newNode = new LinkNode();
			newNode.val = nums2[i];
			newNode.next = null;
			p1.next = newNode;
			p1 = newNode;
		}
		//初始化L1
		L1.val = nums1[0];
		LinkNode newNode = new LinkNode();
		newNode.val = nums1[1];
		newNode.next = null;
		L1.next = newNode;
		System.out.println("输出合并前的L1");
		L1.displayList();
		System.out.println("输出合并前的L2");
		L2.displayList();
		System.out.println("合并L1和L2");
		L1.merge(L2);
		System.out.println("输出合并后的L1");
		L1.displayList();
		System.out.println("输出合并后的L2");
		L2.displayList();
	}

	public static class LinkNode {
		int val;
		LinkNode next;

		/* L1={1,3,5}, L2={2,4} */
		private void merge(LinkNode node) {
			System.out.println("开始合并");
			LinkNode p, pre,rear;
			if (node.val > val) {// 把小的那个结点作为新链表的起始结点
				System.out.println("L1的第一个结点作为起始结点");
				p = next;
				pre = this;
				rear = node.next;
				int count = 0;
				while (node != null) {
					count++;
					if(count >10)
						break;
//					System.out.println("把L2的元素"+node.val+"插入L1中去");
					while (p.val < node.val) {
						// 找到插入位置
						pre = p;
						p = p.next;
					}
					// node结点插入在pre结点后面
//					System.out.println("node结点插入在"+pre.val+"结点后面");
					node.next = pre.next;
					pre.next = node;
					node = rear;// node后移
					if(rear != null)
						rear = rear.next;
				}
			} else {
				System.out.println("L2的第一个结点作为起始结点");
				pre = node;
				p = node.next;
				// 把L1的元素插入L2中去
				LinkNode p2 = this,rear2 = next;// 用来遍历L1
				while (p2 != null) {
					while (p.val < p2.val) {
						// 找到插入位置
						pre = p;
						p = p.next;
					}
					// p2结点插入到pre结点后面
					p2.next = pre.next;
					pre.next = p2;
					p2 = rear2;// p2结点后移
					if(rear2 != null) {
						rear2 = rear2.next;
					}
				}
			}
		}// merge
		
		public  void displayList() {
			LinkNode p = this;
			while(p!=null) {
				System.out.println(p.val);
				p = p.next;
			}
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值