数据结构与算法_合并两个排好顺序的链表或数组

本文介绍了一种合并两个已排序链表的方法,包括递归和非递归两种实现方式,并详细阐述了合并两个已排序数组的过程。这些方法在不破坏原始数据结构的前提下有效地将数据整合到一个新的有序结构中。

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

合并两个排好顺序的链表

<思路>

A链表和B链表的合并,可以看成是两者头节点的值较大的那一个,被拿出来加入到合成链表的尾部,然后让被拿掉节点的新链表与另一个链表重复这么一个过程【这个过程会销毁原来的两个链表的本身的结构,比较完成以后,原来的两个链表就不存在了】

<代码>

递归

//合并函数的接口【interface】
	private Node combine(Node link1,Node link2){
		Node link3 = new Node();
		Node tail = link3;
		combine(link1,link2,tail);
		return link3;				
	} 

//合并函数的递归实现
	private void combine(Node link1,Node link2,Node tail){
		//如果两个链表其中有一个已经为空,那么就把另一个直接连接到合成链表的尾部,然后结束递归
		if(link1 ==null || link2 == null){
			if(link1 == null){
				tail.next = link2;
			}else if(link2 == null){
				tail.next = link1;
			}else
				tail.next = null;
				
		}else{
			//否则比较两个链表的头节点的值,值较大的接到合成链表的尾部,然后让该链表的头指针后移一个
			if(link1.number < link2.number){
				tail.next = link1;
				tail = tail.next;
				combine(link1.next,link2,tail);				
			}
			else{
				tail.next = link2;
				tail = tail.next;
				combine(link1,link2.next,tail);
			}
		}
	}

非递归

private Node combine_non_recursive(Node list1,Node list2){
		Node head = new Node();
		Node tail = head;
		
		while(list1 !=null & list2 != null){
			if(list1.number < list2.number){
				tail.next = list1;
				tail = tail.next;
				list1 = list1.next;
			}else{
				tail.next = list2;
				tail = tail.next;
				list2 = list2.next;
			}
		}
		
		if(list1 == null){
			tail.next = list2;
		}else if(list2 == null){
			tail.next = list1;
			
		}
		
		return head;
	}


合并两个排好序的数组

<思路>跟上面一样,不同的是,这个过程不会销毁原来的两个数组的结构,而是引进了一个新的数组作为合并数组

<代码>(递归)

/**
	 * 
	 * @param array1 要比较的数组1
	 * @param array2 要比较的数组2
	 * @param array3 存放结果的数组3
	 * @param start1 指向数组1还没有比较部分的最前面一个元素
	 * @param start2 指向数组2还没有比较部分的最前面一个元素
	 * @param len1 数组1的长度
	 * @param len2 数组2的长度
	 */
	private void combineArray_recursive(int[] array1,int[] array2,int[] array3,
			int start1,int start2,int len1,int len2){
		 /** 1.判断两个数组是否有一个已经合并完毕
		  *  2.合并完毕的不用管,没有合并完毕的要单独继续合并,也就是两个else if语句
		  *  3.直到两个数组都合并完毕,也就是start = length,停止递归
		  */
		while(start1>= len1 || start2 >= len2){			
			if(start1>= len1 && start2 >= len2){
				return;
			}			
			else if(start1 >=len1){
				array3[start1+start2] = array2[start2];
				start2++;
			}else if(start2 >= len2){
				array3[start1+start2] = array2[start1];
				start1++;
			}
		}		
		
		/**1.如果两个数组都没有到尾
		 * 2.比较两个数组当前位置对应的值,小的放进新数组,改变被取值的数组的start值,然后递归合并
		 * 接下来的两个数组
		 */
		if(array1[start1] <= array2[start2]){
			array3[start1+start2] = array1[start1];
			combineArray_recursive(array1, array2, array3, ++start1, start2, len1, len2);
		}else if(array1[start1]> array2[start2]){
			array3[start1+start2] = array2[start2];
			combineArray_recursive(array1, array2, array3, start1, ++start2, len1, len2);
		}
		
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值