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

来源:互联网 发布:vb运算符号 编辑:程序博客网 时间:2024/05/16 18:50

合并两个排好顺序的链表

<思路>

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


阅读全文
0 0
原创粉丝点击