您的位置:首页 > 理论基础 > 数据结构算法

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

2017-08-17 08:30 375 查看
合并两个排好顺序的链表

<思路>

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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: