Java中如何合并两个列表?5种高效方法详解与实例

这是文章《如何在Java中合并两个列表?》的第1部分(共9部分)。

在Java中合并两个列表常常是一个有用的操作。这些列表可以是ArrayList或者LinkedList。

如何在Java中合并两个列表

在Java中,我们有多种方法可以合并两个列表。让我们探索一些直接的方法来完成您的工作!

1. 使用addAll()方法将两个列表合并

addAll()方法是合并两个列表的最简单和最常见的方法。

对于 ArrayList:

import java.util.ArrayList;

public class Main {

    public static void main(String[] args)
    {
ArrayList<Integer> l1 = new ArrayList<Integer>();
        l1.add(1);
        l1.add(3);
        l1.add(5);
ArrayList<Integer> l2 = new ArrayList<Integer>();
        l2.add(2);
        l2.add(4);
        l2.add(6);
ArrayList<Integer> merge = new ArrayList<Integer>();
        merge.addAll(l1);
        merge.addAll(l2);
System.out.println("列表1 : "+l1);
System.out.println("列表2 : "+l2);
System.out.println("合并后 : "+merge);
}
}
使用addAll()方法合并ArrayList

请注意元素出现的顺序与调用addAll()方法的顺序相一致。

对于链表:

import java.util.LinkedList;

public class Main {

    public static void main(String[] args)
    {
LinkedList<Integer> L1 = new LinkedList<>();
        L1.add(1);
        L1.add(3);
        L1.add(5);
LinkedList<Integer> L2 = new LinkedList<>();
        L2.add(2);
        L2.add(4);
        L2.add(6);
LinkedList<Integer> merged = new LinkedList<>();
        merged.addAll(L1);
        merged.addAll(L2);

System.out.println("链表L1 : "+L1);
System.out.println("链表L2 : "+L2);
System.out.println("合并后的链表 : "+merged);
}
}
使用addAll()方法合并链表

使用迭代器在Java中合并两个列表。我们可以使用一个迭代器遍历列表并合并。

对于ArrayList: 只需一个选项

对于ArrayList:

import java.util.ArrayList;

public class Main {

    public static void main(String[] args)
    {
ArrayList<Integer> l1 = new ArrayList<Integer>();
        l1.add(1);
        l1.add(3);
        l1.add(5);
ArrayList<Integer> l2 = new ArrayList<Integer>();
        l2.add(2);
        l2.add(4);
        l2.add(6);

ArrayList<Integer> Itmerge = new ArrayList<>();
        Iterator i = l1.iterator();
        while (i.hasNext()) {
           Itmerge.add((int)i.next());
        }
        i=l2.iterator();
        while (i.hasNext()) {
            Itmerge.add((int)i.next());
        }
System.out.println("L1 : "+l1);
System.out.println("L2 : "+l2);
System.out.println("Merged : "+Itmerge);
}
}

迭代器首先遍历ArrayList l1,并将所有的元素添加到Itmerge中,然后遍历ArrayList l2,并将所有的元素添加到Itmerge中。

Iterator Arraylist 1
另一种合并这两个列表的方法是将一个列表的元素简单地添加到另一个列表中。除非需要保持现有数据的完整性,否则无需创建新列表。

Iterator i = l1.iterator();
while (i.hasNext())
{
  l2.add((int)i.next());
}

System.out.println("合并后的列表:"+l2);

在这种情况下,所有的元素都被添加到列表l2中。这样可以节省在创建额外列表上花费的内存。将一个列表的元素添加到另一个列表中可以节省额外的遍历。

单次迭代合并示例

对于链表(LinkedList):

import java.util.LinkedList;
import java.util.Iterator;

public class Main {

    public static void main(String[] args)
    {
        // 创建第一个链表并添加元素
        LinkedList<Integer> L1 = new LinkedList<>();
        L1.add(1);
        L1.add(3);
        L1.add(5);
        
        // 创建第二个链表并添加元素
        LinkedList<Integer> L2 = new LinkedList<>();
        L2.add(2);
        L2.add(4);
        L2.add(6);
        
        // 创建用于存储合并结果的链表
        LinkedList<Integer> merged = new LinkedList<>();
        
        // 使用迭代器合并两个链表
        Iterator i = L1.iterator();
        while (i.hasNext()) {
           L2.add((int)i.next());
        }
        
        // 输出合并后的链表
        System.out.println(L2);
    }
}
链表合并迭代器

使用for循环合并多个列表

使用for循环合并两个列表也是一种非常实用的方法。

对于ArrayList,我们可以按照以下方式操作:

import java.util.ArrayList;

public class Main {

    public static void main(String[] args)
    {
ArrayList<Integer> l1 = new ArrayList<Integer>();
        l1.add(1);
        l1.add(3);
        l1.add(5);
ArrayList<Integer> l2 = new ArrayList<Integer>();
        l2.add(2);
        l2.add(4);
        l2.add(6);
ArrayList<Integer> Itmerge = new ArrayList<>();
        for(int i=0;i<l1.size();i++){
            Itmerge.add(l1.get(i));
        }
        for(int i=0;i<l2.size();i++){
            Itmerge.add(l2.get(i));
        }
System.out.println(Itmerge);
}
}

上述代码通过循环遍历两个ArrayList,并将每个元素逐个添加到一个新创建的列表中,从而实现列表合并。

另外,我们也可以直接将一个列表的元素添加到另一个列表中,这样可以节省额外的遍历步骤和内存空间。

 for(int i=0;i<l2.size();i++){
      l1.add(l2.get(i));
   }
System.out.println(l1);

这个for循环逐一将l2的元素添加到l1中。执行完毕后,l1将包含合并后的所有元素,成为最终的合并列表。

使用for循环合并ArrayList示例图

对于链表:

为了更好地理解链表的遍历,让我们定义一个自己的链表。

这将需要一个节点的类。一个节点需要两个东西,数据和下一个节点的地址。

节点类的代码

public class Node {
    int data;
    Node next;
    public Node(int data){
        this.data=data;
        next=null;
    }
}

请注意,next是Node类型,因为它存储了一个节点的地址。创建和之前示例中使用的相同的两个列表:

public class Main {

    public static void main(String[] args)
    {        
        Node head = new Node(1);
        Node temp = new Node(3);
        head.next=temp;
        Node temp1 = new Node(5);
        temp.next=temp1;
        Node head2 = new Node(2);
        Node temp2 = new Node(4);
        head2.next=temp2;
        Node temp3 = new Node(6);
        temp2.next=temp3;
}
}

这将创建类似于以下的列表:

列表1

每个箭头代表下一个链接。为了将两个列表连接起来,我们需要将一个列表的末尾连接到第二个列表的开头。

列表合并图示1

这是文章《如何在Java中合并两个列表?》的第8部分(共9部分)。

内容片段:这可以通过以下方式完成:

node trav=head;
while(trav.next!=null){
    trav=trav.next;
}
trav.next=head2;

初始化并指向第一个列表的首部。遍历第一个列表,直到trav到达第一个列表的末尾。

当到达末尾时,它将最后一个节点的下一个链接更改为第二个列表的头部。这样形成了两个列表之间的链接。

打印所有的列表

public class Main {

    public static void main(String[] args)
    { 
        node head = new node(1);
        node temp = new node(3);
        head.next=temp;
        node temp1 = new node(5);
        temp.next=temp1;
        node head2 = new node(2);
        node temp2 = new node(4);
        head2.next=temp2;
        node temp3 = new node(6);
        temp2.next=temp3;

//打印列表1
        System.out.println("列表1:");
        node trav = head;

        while(trav!=null){
            System.out.print(trav.data + " ");
            trav=trav.next;
        }

        System.out.println();
//打印列表2
        System.out.println("列表2:");
        trav= head2;

        while(trav!=null){
            System.out.print(trav.data + " ");
            trav=trav.next;
        }
        System.out.println();

//合并两个列表

         trav=head;
        while(trav.next!=null){
            trav=trav.next;
        }
        trav.next=head2;
//打印合并后的列表
        System.out.println("合并后的列表:");
        trav = head;
        while(trav!=null){
            System.out.print(trav.data + " ");
            trav=trav.next;
        }
}
}
合并链表输出结果

结论

我们看到了在Java中合并两个列表的不同方式。这些方式包括内置函数和基本的for循环。上面的最后一个示例对Java中列表的工作原理有更深入的理解。使用最后一个示例的方法,您可以更好地控制列表中元素出现的顺序。

bannerAds