这篇文章讲述的是数据结构部分的线性表的应用的java实现,如有错误或者不当之处,还望各位大神批评指正。
问题描述
一直两个线性表L1和L2中的元素已经按非递减有序排列现要求将L1和L2归并为一个新的线性表L3且扔按非递减有序排列
算法分析
- 借助第三个线性表长度足以放下这两个线性表长度为L1.length+L2.length
- 通过两个指针分别指向L1和L2用于遍历其中 的的元素
- 将两个指针所指的元素的较小值放入L3中
- 时间复杂度:O(n) 空间复杂度:O(n)
代码实现
package List_question;
import list.LinkList;
import list.List;
/**
* @author 叶清逸
* @date 2018年7月20日下午4:27:28
* @version 1.0
* @project dataStructureQuestion
*/
public class Q1_MergeList{
/**
* 问题分析:一直两个线性表L1和L2中的元素已经按非递减有序排列现要求将L1和L2归并为一个新的线性表L3且扔按非递减有序排列
*
* 算法分析:1. 借助第三个线性表长度足以放下这两个线性表长度为L1.length+L2.length
* 2. 通过两个指针分别指向L1和L2用于遍历其中 的的元素
* 3. 将两个指针所指的元素的较小值放入L3中
*
* 复杂度分析:时间复杂度:O(n) 空间复杂度:O(n)
*/
public static void main(String[] args) {
/*初始化L1和L2并放入数据*/
List L1 = new LinkList() ;
L1.init();
L1.put(3);
L1.put(5);
L1.put(8);
L1.put(11);
List L2 = new LinkList() ;
L2.init();
L2.put(2);
L2.put(6);
L2.put(8);
L2.put(9);
L2.put(11);
L2.put(15);
L2.put(20);
System.out.print("L1:");
L1.print();
System.out.print("L2:");
L2.print();
/*执行合并操作*/
List L3 = merge(L1 , L2) ;
/*输出结果*/
System.out.print("L3:");
L3.print();
}
/**
* @explain merge方法:将有序线性表L1和L2合并
* @param L1 线性表L1
* @param L2 线性表L2
* @return SequenceList 返回合并后的线性表
* @throws
* @author 叶清逸
* @date 2018年7月20日 下午4:27:44
*/
public static List merge(List L1 , List L2){
/*初始化顺序表L3,由于我定义的线性表是自动扩展长度的所以不用指明初始长度*/
List L3 = new LinkList() ;
L3.init();
/*定义两个变量用来表示遍历的索引*/
int i = 1 ;
int j = 1 ;
/*遍历两个顺序表*/
/*情况一:两个表都有没遍历完时*/
while(i<=L1.length() && j<=L2.length()){
/*读取索引所指的元素*/
int p = (int) L1.get(i) ;
int q = (int) L2.get(j) ;
/*共可能有如下两种情况*/
if(p <= q){
L3.put(p);
i++ ;
}else if(p > q){
L3.put(q) ;
j++ ;
}
}
/*情况二:表L1没有遍历完而表L2已经遍历完*/
while(i <= L1.length()){
/*读取索引所指的元素*/
int p = (int) L1.get(i) ;
/*放入元素*/
L3.put(p);
i++ ;
}
/*情况三:表L1已经遍历完而表二没有遍历完*/
while(j <= L2.length()){
/*读取索引所指的元素*/
int q = (int) L2.get(j) ;
L3.put(q);
j++ ;
}
return L3 ;
}
}
样例输出
L1:3 5 8 11
L2:2 6 8 9 11 15 20
L3:2 3 5 6 8 8 9 11 11 15 20