日期:2014-05-20 浏览次数:20946 次
/**
* 功能:把元素递增排 列的链表A和B合并为C,且C中元素递减排列,使用原空间
* 参数:LinkList类型la
* 参数:LinkList类型 lb
* 返回值:LinkList类型
* 例如:参数为:A={1,2,4,5},B={4,8},结果为:C={8,5,4,4,2,1}。
*/
public static LinkList reverseMerger(LinkList la, LinkList lb) {
LinkList lc = new LinkList();
int pointA = la.length;
int pointB = lb.length;
int pointAY = 1;
int pointBY = 1;
if(lc.head == null){
if(la.getData(pointA) > lb.getData(pointB)){
lc.listHeadInsert(la.getData(pointA));
pointA--;
}
else{
lc.listHeadInsert(lb.getData(pointB));
pointB--;
}
}
while(pointAY <= pointA && pointBY <= pointB){
if(la.getData(pointAY) < lb.getData(pointBY)){
lc.listHeadInsert(la.getData(pointAY));
pointAY++;
}
else{
lc.listHeadInsert(lb.getData(pointBY));
pointBY++;
}
}
if(pointAY <= pointA){
for(int j = pointAY; j <= pointA; j++){
lc.listHeadInsert(la.getData(j));
}
}
if(pointBY <= pointB){
for(int k = pointBY; k < pointB; k++){
lc.listHeadInsert(lb.getData(k));
}
}
return lc;
}
//测试用MAIN方法,上面的方法和这个测试的MAIN方法都丢在LinkList类中写的
public static void main(String[] args){
LinkList la = new LinkList();
LinkList lb = new LinkList();
la.listHeadInsert(1);
la.listHeadInsert(5);
la.listHeadInsert(4);
la.listHeadInsert(2);
lb.listHeadInsert(4);
lb.listHeadInsert(8);
LinkList lc = LinkList.reverseMerger(la, lb);
for(int i = 1; i <= lc.length; i++){
System.out.println(lc.getData(i));
}
}
------解决方案--------------------
思路就是:先把a,b两个链表的最大元素,也就是两个链表的最后一个元素的值取出来做比较,大的做合并后的链表c的头节点~
然后把a,b里面剩余的接点从小的开始比较,最小的插入到链表c的头节点后面,依次循环插入,最后,如果a中元素已经都插入到c中且b中还有剩余未插的,把b中剩余的元素按照由小到大的顺序插入到c中.