题目2
给定两个已排序的表L1和L2,只使用基本的表操作编写
(1)计算L1与L2的交运算。
(2)计算L1与L2的并运算。
思路:
(1)求”交集”就是:“去异存同”。使用链表的迭代器Iterator,首先获得两个表中的第一个元素,itemL1和itemL2,然后调用comparaTo()方法,进行二者的比较。
如果比较结果compareResult>0,将它们其中之一添加到空链表中存储;
如果比较结果compareResult<0,因为表是有序的,所以将表L2向后遍历,更新itemL2的值,直到itemL1==itemL2;反之亦然。
(2)求”并集”就是:“删重保全”。与(1)不同之处在于:当comparaReseult > 0时,存储当前的itemL2的值,因为表是有序的,itemL1>itemL2说明,它们相等的情况只可能发生在表L2的当前元素的后面;反之亦然。
这里写代码片
//1.计算L1与L2的交运算
public static <AnyType extends Comparable<? super AnyType>>
void intersection(List<AnyType> L1,List<AnyType> L2,List<Anytype> Intersect )
{
List<AnyType> iterL1 = L1.ListIterator();
List<AnyType> iterL2 = L2.ListIterator();
AnyType itemL1 = null,itemL2 = null;
//get first item in every list
if(iterL1.hasNext()&&iterL2.hasNext())
{
itemL1 = iterL1.next();
itemL2 = iterL2.next();
}
while(itemL1!=null&&itemL2!=null)
{
int compareResult = itemL1.comparaTo(itemL2);
if(compareResult==0)
{
Intersect.add(itemL1);
itemL1 = iterL1.hasNext()?iterL1.next():null;
itemL2 = iterL2.hasNext()?iterL2.next():null;
}
else if(compareResult>0)
{
//因为表是有序的。
itemL2 = iterL2.hasNext()?iterL2.next():null;
}
else if(compareResult<0)
{
itemL1 = iterL1.hasNext()?iterL1.next():null;
}
}
}
//2.计算L1与L2的并运算
public static <AnyType extends Comparable<? super AnyType>>
void union(List<AnyType> L1,List<AnyType> L2,List<Anytype> Result)
{
List<AnyType> iterL1 = L1.ListIterator();
List<AnyType> iterL2 = L2.ListIterator();
AnyType itemL1 = null,itemL2 = null;
//get first item in every list
if(iterL1.hasNext()&&iterL2.hasNext())
{
itemL1 = iterL1.next();
itemL2 = iterL2.next();
}
while(itemL1!=null&&itemL2!=null)
{
int compareResult = itemL1.comparaTo(itemL2);
if(compareResult==0)
{
Reseult.add(itemL1);
itemL1 = iterL1.hasNext()?iterL1.next():null;
itemL2 = iterL2.hasNext()?iterL2.next():null;
}
else if(compareResult>0)
{
//因为表是有序的,itemL1>itemL2说明,它们相等的情况只可能发生在表L2的当前元素的后面。
Result.add(itemL2);
itemL2 = iterL2.hasNext()?iterL2.next():null;
}
else if(compareResult<0)
{
//因为表是有序的,itemL1>itemL2说明,它们相等的情况只可能发生在表L1的当前元素的后面。
Result.add(itemL1);
itemL1 = iterL1.hasNext()?iterL1.next():null;
}
}
}