合并两个排好顺序的链表
<思路>
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);
}
}