Java 合并两个已排序 LinkedList

本文介绍了如何在Java中合并两个已排序的LinkedList。虽然合并算法本身不复杂,但在使用Iterator处理LinkedList时遇到了挑战。问题在于Java的Iterator在调用next()后会自动前进,但通过ListIterator的previous()方法可以成功解决这一问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

合并两个已排序的数组并不难,在学习 mergesort 的时候应该都有学到,但在 Java 实现合并 LinkedList 中遇到了小小的问题,简短总结下。

首先把合并的算法用伪代码写下来:

public List mergeTwoLists(List l1, List l2) {
    List result = new List();
    Iterator it1 = l1.iterator();
    Iterator it2 = l2.iterator();
    while(it1 != null || it2 != null){
        if(it1 != null && it2 != null){
            if(it1.val < it2.val){
                result.add(it1.val);
                it1 = it1.next;
            }else{
                result.add(it2.val);
                it2 = it2.next;
            }
        }else if(it1==null){
            result.add(it2.val);
            it2 = it2.next;
        }else if(it2==null){
            result.add(it1.val);
            it1 = it1.next;
        }
    }
    return result;
}

算法没有问题,但在实现的时候遇到了 Java Iterator 的问题:Java 的 Iterator 在访问节点的时候,是调用 next() 方法,会自动前进一位。通过 ListIterator.previous 可以解决这个问题。具体代码如下:

public LinkedList<Long> mergeTwoSortedLinkedList(LinkedList<Long> list0, LinkedList<Long> list1) {
    ListIterator<Long> it0 = list0.listIterator();
    ListIterator<Long> it1 = list1.listIterator();
    LinkedList<Long> result = new LinkedList<>();
    while(it0.hasNext() || it1.hasNext()) {
        if(it0.hasNext() && it1.hasNext()) {
            Long val0 = it0.next();
            Long val1 = it1.next();
            if (val0 < val1) {
                result.add(val0);
                it1.previous();
            } else {
                result.add(val1);
                it0.previous();
            }
        } else if (!it0.hasNext()) {
            Long val = it1.next();
            result.add(val);
        } else {
            Long val = it0.next();
            result.add(val);
        }
    }
    return result;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值