利用ArrayList求解两个有序数列的交集的并集
package Array_list_study;
import java.util.*;
public class Intersect {
public static void main(String[] args){
System.out.println("list1:");
ArrayList<Integer> lst1 = new ArrayList<Integer>();
int[] lst01 = enter_lst();
for(int n:lst01){
lst1.add(n);
}
System.out.println(lst1);
System.out.println("list2:");
ArrayList<Integer> lst2 = new ArrayList<Integer>();
int[] lst02 = enter_lst();
for(int n:lst02){
lst2.add(n);
}
System.out.println(lst2);
ArrayList<Integer> intersect = intersect(lst1,lst2);
ArrayList<Integer> union = union(lst1,lst2);
System.out.println("list1,list2的交集为: " + intersect);
System.out.println("list1,list2的并集为: " + union);
}
public static int[] enter_lst(){
Scanner in = new Scanner(System.in);
System.out.print("请输入列表的长度:");
int n = in.nextInt();
int[] lst = new int[n];
System.out.print("请依次输入列表中的数字");
for (int i = 0; i <= n-1; i++){
lst[i] = in.nextInt();
}
return lst;
}
// 求两个有序数列的交集
public static ArrayList<Integer> intersect(ArrayList<Integer> lst1, ArrayList<Integer> lst2){
ArrayList<Integer> intersect = new ArrayList<Integer>();
int i = 0,j = 0;
while(i < lst1.size() && j < lst2.size()){
if(lst1.get(i)==lst2.get(j)){
intersect.add(lst1.get(i));
i++;
j++;
} else if(lst1.get(i) < lst2.get(j)){
i++;
} else{
j++;
}
}
// 讨论两个列表长度不等的情况下多出的部分
if(lst1.size() > lst2.size()){
if(lst1.get(lst2.size()-1) < lst2.get(lst2.size()-1)){
int end = lst2.get(lst2.size()-1);
for(int a = lst2.size();a <lst1.size();a++){
if(lst1.get(a) == end){
intersect.add(end);
}else if(lst1.get(a) > end){
break;
}
}
}
}else{
if(lst2.get(lst1.size()-1) < lst1.get(lst2.size()-1)){
int end = lst1.get(lst1.size()-1);
for(int a = lst1.size();a <lst2.size();a++){
if(lst2.get(a) == end){
intersect.add(end);
}else if(lst2.get(a) > end){
break;
}
}
}
}
return intersect;
}
// 求两个有序数列的并集
public static ArrayList<Integer> union(ArrayList<Integer> lst1, ArrayList<Integer> lst2){
ArrayList<Integer> union = new ArrayList<Integer>();
int i = 0,j = 0;
while(i < lst1.size() && j < lst2.size()){
if(lst1.get(i)==lst2.get(i)){
union.add(lst1.get(i));
i++;
j++;
} else if(lst1.get(i) < lst2.get(j)){
union.add(lst1.get(i));
i++;
} else{
union.add(lst2.get(j));
j++;
}
}
// 讨论两个列表长度不等的情况下多出的部分
if(lst1.size() > lst2.size()){
if(lst1.get(lst2.size()-1) > lst2.get(lst2.size()-1)){
for(int a = lst2.size()-1;a < lst1.size();a++){
union.add(lst1.get(a));
}
}else if(lst1.get(lst2.size()-1) == lst2.get(lst2.size()-1)){
for(int a = lst2.size();a < lst1.size();a++){
union.add(lst1.get(a));
}
}else{
union.add(lst2.get(lst2.size()-1));
for(int a = lst2.size();a <lst1.size();a++){
if(lst1.get(a) != lst2.size()-1){
union.add(lst1.get(a));
}
}
}
}else{
if(lst2.get(lst1.size()-1) > lst1.get(lst1.size()-1)){
for(int a = lst1.size()-1;a < lst2.size();a++){
union.add(lst2.get(a));
}
}else if(lst2.get(lst1.size()-1) == lst1.get(lst1.size()-1)){
for(int a = lst1.size();a < lst2.size();a++){
union.add(lst2.get(a));
}
}else{
union.add(lst1.get(lst1.size()-1));
for(int a = lst1.size();a <lst2.size();a++){
if(lst2.get(a) != lst1.get(lst1.size()-1)){
union.add(lst2.get(a));
}
}
}
}
return union;
}
}