我需要将两个排序的链表合并为一个排序的表。我已经尝试这样做了几个小时,但是当我到达列表之一的末尾时,我总是会遇到麻烦。这是我所能做的最好的。我的filaA和filaB是数据类型为“ long”的喜欢的列表。

            LinkedList<Long> result= new LinkedList<Long>();
            iterA = filaA.listIterator();
            iterB = filaB.listIterator();
            while (iterA.hasNext() && iterB.hasNext()) {
                n = iterA.next();
                m = iterB.next();
                if (n <= m) {
                    filafusion.add(n);
                    n = iterA.next();
                } else {
                    filafusion.add(m);
                    m = iterB.next();
                }
            }
            if (iterA.hasNext()) {
                while (iterA.hasNext()) {
                    filafusion.add(iterA.next());
                }
            } else {
                while (iterB.hasNext()) {
                    filafusion.add(iterB.next());
                }
            }
            iterfusion = filafusion.listIterator();
            while (iterfusion.hasNext()) {
                System.out.print(iterfusion.next());
            }
        }


这里的总体思路是一个一个地比较,然后将迭代器移到下一个。但是它们是同时移动的,所以我只比较第一与第一,第二与第二,依此类推。

我还尝试将n = iterA.next();m = iterB.next();移到while循环之前,这使它工作得更好,但是后来我不知道哪个列表用完了元素。仅在列表长度相同时才起作用,但是其中一个元素不会输入结果。

我在这里看到了很多代码,但是它们都使用Nodes和递归以及我不熟悉的东西。我认为使用迭代器可以提高效率,但这就是让我感到困惑的地方,我没有在应该迭代的地方:(

任何建议将不胜感激。

最佳答案

我刚刚修改了您的代码。如果您能够使用Java 8,那么下面有一个简短得多的解决方案。

    Iterator iterA = filaA.listIterator();
        Iterator iterB = filaB.listIterator();
        Long n = (Long)iterA.next();
        Long m = (Long)iterB.next();
        while (true) {
            if (n <= m) {
                filafusion.add(n);
                if(iterA.hasNext()){
                    n = (Long)iterA.next();
                }
                else{
                    filafusion.add(m);
                    while(iterB.hasNext()){
                        filafusion.add((Long)iterB.next());
                    }
                    break;
                }
            } else {
                filafusion.add(m);
                if(iterB.hasNext()){
                    m = (Long)iterB.next();
                }
                else{
filafusion.add(n);
                    while(iterA.hasNext()){
                        filafusion.add((Long)iterA.next());
                    }
                    break;
                }

            }
        }
        Iterator iterfusion = filafusion.listIterator();
        while (iterfusion.hasNext()) {
            System.out.println(iterfusion.next());
        }


这是Java 8的实现方法。它也适用于未排序的输入列表:

    Stream stream = Stream.concat(filaA.stream(), filaB.stream());
    stream.sorted().forEach(System.out::println);

10-06 10:53