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

合并两个排好顺序的链表

<思路>

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);
		}
		
	}


阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_24623403/article/details/77285012
上一篇数据结构与算法_斐波那契数列的递归与非递归
下一篇数据结构与算法_快速排序
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭