ebay笔试题 -将两个已排好序的List做merge 返回一个新的顺序的List

在ebay做的一个笔试题,不能够用已有的排序函数

将两个已排好序的List做merge 返回一个新的顺序的List

import  java.util.ArrayList;
import  java.util.Arrays;
import  java.util.List;
import  java.util.ListIterator;

public   class  ListMerge  {

    
public static List ListMerge(List first, List second) {
        ListIterator iteratorFirst 
= first.listIterator();
        ListIterator iteratorSecond 
= second.listIterator();

        
int firstPosition = 0;
        Object next;
        
boolean endOfFirst = false;
        
while (iteratorSecond.hasNext()) {
            next 
= iteratorSecond.next();
            
boolean existed = first.contains(next);
            
if (existed) {
                
continue;
            }

            
while (((Comparable) first.get(firstPosition)).compareTo(next) < 0){
                firstPosition 
+= 1;
                
if (firstPosition < first.size() - 1{
                    
continue;
                }
 else {
                    endOfFirst 
= true;
                    
break;
                }

            }

            
if (!endOfFirst) {
                first.add(firstPosition, next);
            }
 else {
                
while (iteratorSecond.hasNext()) {
                    next 
= iteratorSecond.next();
                    first.add(next);
                }

                
break;           
            }

        }

           
        
return first;
    }


    
public static void main(String[] args) {
        List first 
= new ArrayList();
        
for (int i = 0; i < 10; i++{
            first.add(
new Integer(i * 2));
        }

        List second 
= new ArrayList();
        
for (int i = 0; i < 10; i++{
            second.add(
new Integer(i * 2 + 1));
        }


        ListIterator iteratorFirst 
= first.listIterator();
        ListIterator iteratorSecond 
= second.listIterator();

        
while (iteratorFirst.hasNext()) {
            System.out.print(iteratorFirst.next() 
+ "  ");
        }

        System.out.println();

        
while (iteratorSecond.hasNext()) {
            System.out.print(iteratorSecond.next() 
+ "  ");
        }

        System.out.println();

        List result 
= ListMerge.ListMerge(first, second);
        ListIterator iteratorResult 
= result.listIterator();

        
while (iteratorResult.hasNext()) {
            System.out.print(iteratorResult.next() 
+ "  ");
        }

        System.out.println();
    }

}

结果 :
0  2  4  6  8  10  12  14  16  18
1  3  5  7  9  11  13  15  17  19
0  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  18  19

现在的缺点是改变了传入的first对象的内容...

大概实现了这个题目的要求
不过DS掌握的不好,呵呵,所以不知道有没有什么简单的方法
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是将两个有顺序表合并为一个的有顺序表,返回结果顺序表的代码: ``` #include <stdio.h> #define MAXSIZE 100 typedef struct { int *elem; int length; } SqList; void InitList(SqList *L) { // 初始化顺序表 L->elem = (int *)malloc(MAXSIZE * sizeof(int)); L->length = 0; } void MergeList(SqList L1, SqList L2, SqList *L) { // 合并两个有顺序表为一个的有顺序表 int i = 0, j = 0; while (i < L1.length && j < L2.length) { if (L1.elem[i] <= L2.elem[j]) { L->elem[L->length++] = L1.elem[i++]; } else { L->elem[L->length++] = L2.elem[j++]; } } while (i < L1.length) { // 把剩余的元素添加到 L 中 L->elem[L->length++] = L1.elem[i++]; } while (j < L2.length) { L->elem[L->length++] = L2.elem[j++]; } } void PrintList(SqList L) { // 打印顺序表 for (int i = 0; i < L.length; i++) { printf("%d ", L.elem[i]); } printf("\n"); } int main() { SqList L1, L2, L; int arr1[] = {1, 3, 5, 7, 9}; int arr2[] = {2, 4, 6, 8, 10}; InitList(&L1); InitList(&L2); // 初始化有顺序表 L1 和 L2 for (int i = 0; i < sizeof(arr1) / sizeof(int); i++) { L1.elem[i] = arr1[i]; L1.length++; } for (int i = 0; i < sizeof(arr2) / sizeof(int); i++) { L2.elem[i] = arr2[i]; L2.length++; } InitList(&L); MergeList(L1, L2, &L); // 合并 L1 和 L2 为顺序表 L PrintList(L); return 0; } ``` 以上代码中,定义了一个结构体 SqList 作为顺序表类型,包含了一个指向动态分配内存空间的整型数组 elem,以及记录数组长度的 length。通过 InitList 函数初始化顺序表,通过 MergeList 合并 L1 和 L2 两个有顺序表,并把结果存储在申请的动态内存空间中的 L 中,最后通过 PrintList 函数打印顺序表 L 的内容。注意这里使用了顺序表的下标特性,合并两个顺序表时,从两个顺序表的第一个元素开始比较,将较小的元素添加到顺序表 L 中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值