关于合并有序数组/链表的总结
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/53872766冷血之心的博客)
通过最近的研究,发现好多公司在笔试和面试中还是挺喜欢让你写一些合并类的程序。主要有合并两个有序数组和合并两个有序单链表(可扩展考虑如何合并K个有序链表),本博客中,对合并有序数组和合并有序链表做了一个总结,以便自己接下来的翻阅,也为了给小伙伴分享。
1、合并两个有序的数组
算法步骤如下:
- 建立一个可以容纳两个有序数组的新数组
- 通过对数组1和数组2中每位进行比较,存入新数组中
- 当某一个数组较短,比较结束后,将较长数组中剩余的元素都加入新数组中
代码如下:
package cn.ywq.test; public class Client { public static void main(String[] args) { int[] a = { 1, 3, 5, 7, 12, 14, 23, 45, 46, 67, 89, 100 }; int[] b = { 2, 4, 6, 8, 9, 68 }; int[] result = Merge(a, b); for (int i : result) { System.out.println(i); } } private static int[] Merge(int a[], int b[]) { int result[] = new int[a.length + b.length]; int i = 0, j = 0, k = 0; // i:用于标示a数组 j:用来标示b数组 k:用来标示传入的数组 while (i < a.length && j < b.length) { if (a[i] <= b[j]) { result[k++] = a[i++]; // 这种用法 很厉害 } else { result[k++] = b[j++]; // 这种用法 很厉害 } } // 下边的两个循环是将长的数组剩下的部分存入result数组中 while (i < a.length) result[k++] = a[i++]; while (j < b.length) result[k++] = b[j++]; return result; } }
2、合并两个有序的单链表
步骤如下:
- 建立链表的结构
- 创建两个有序的单链表
- 调用合并方法进行合并操作
在合并方法中,通过对链表data域的比较和指针的移动,使用递归的方法来完成合并操作。
代码如下:
package com.ywq.test2; import org.junit.Test; public class Solution2 { @Test public void test() { //创建有序链表list1 0-2-5-7-9 ListNode list1 = new ListNode(0); list1.next = new ListNode(2); list1.next.next = new ListNode(5); list1.next.next.next = new ListNode(7); list1.next.next.next.next = new ListNode(9); //创建有序链表list2 1-3-6-8 ListNode list2 = new ListNode(1); list2.next = new ListNode(3); list2.next.next = new ListNode(6); list2.next.next.next = new ListNode(8); //调用合并方法 ListNode list3 = mergeKLists(list1, list2); //将结果输出 while (list3 != null) { System.out.println(list3.val); list3 = list3.next; } } public ListNode mergeKLists(ListNode list1, ListNode list2) { ListNode result=null; if (list1 == null && list2 == null) { return null; } if (list1 == null) { result = list2; return result; } if (list2 == null) { result = list1; return result; } if (list1.val > list2.val) { result = list2; list2 = list2.next; } else { result = list1; list1 = list1.next; } result.next = mergeKLists(list1, list2); return result; } } class ListNode { public int val; public ListNode next; public ListNode(int val) { this.val = val; this.next = null; } }
如果对你有帮助,记得点赞哦~欢迎大家关注我的博客,可以进群366533258一起交流学习哦~
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇: Action 中获取表单数据的三种方式
- 下一篇:没有了