数据结构与算法_合并两个排好顺序的链表或数组
2017-08-17 08:30
375 查看
合并两个排好顺序的链表
<思路>
A链表和B链表的合并,可以看成是两者头节点的值较大的那一个,被拿出来加入到合成链表的尾部,然后让被拿掉节点的新链表与另一个链表重复这么一个过程【这个过程会销毁原来的两个链表的本身的结构,比较完成以后,原来的两个链表就不存在了】
<代码>
递归
非递归
合并两个排好序的数组
<思路>跟上面一样,不同的是,这个过程不会销毁原来的两个数组的结构,而是引进了一个新的数组作为合并数组
<代码>(递归)
<思路>
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); } }
相关文章推荐
- 链表操作:按值的顺序从小到大, 合并两个链表
- 两个顺序链表的合并【openjudge】
- 合并两个顺序链表
- 合并两个顺序链表的两种方式
- 合并两个无序数组,并且按照从小到大的顺序排列
- 两个顺序线性表的合并,关于数组指针的操作。
- 数组表示的线性表(顺序表)的基本操作,以及合并两个非递减数组线性表
- 实现两个链表的合并 可变长顺序表设计 数据结构
- 将两个无序数组合并为有序链表
- (LeetCode刷题)合并两个有序的链表和数组
- Java将两个有序链表合并为一个有序链表、将两个有序数组合并成一个有序数组
- Java如何将两个数组的元素按顺序合并
- 剑指offer 01-06解答思路以及代码(顺序数组找特定数字,替换空格字符,链表反转输出,重建二叉树,两个栈实现队列效果,旋转数组最小元素)
- 算法:给定两个已从小到大排好序的整型数组arrA和arrB,将两个数组合并成arrC,使得arrC也要按从小到大的顺序排好序
- 合并两个有序链表(非递归与递归)
- 剑指offer-面试题17-合并两个排序的链表
- 合并两个排序链表
- 合并两个排序链表
- [LeetCode]Sort List 链表排序 + Merge Two Sorted List 合并两个有序链表
- 剑指offer面试题 合并两个排序的链表