📜  两个链表的并集和交集的Java程序(1)

📅  最后修改于: 2023-12-03 15:21:34.225000             🧑  作者: Mango

两个链表的并集和交集的Java程序介绍

链表是一种常用的数据结构,其具有插入和删除元素很方便的特点。在Java中,我们可以使用LinkedList类来实现一个链表。本文将介绍如何使用Java语言实现两个链表的并集和交集。

链表的定义及实现

在Java语言中,我们可以使用LinkedList类来实现一个单向链表。示例代码如下:

public class ListNode {
    int val;
    ListNode next;
    ListNode(int x) {
        val = x;
        next = null;
    }
}

其中,ListNode类表示链表节点的定义,包含一个整数类型的val成员以及一个指向下一个节点的指针next。

我们还需要定义一个LinkedList类来表示一个完整的链表,示例代码如下:

public class LinkedList {
    ListNode head;

    // 在链表尾部插入一个节点
    public void add(int val){
        ListNode newNode = new ListNode(val);
        if(head == null){
            head = newNode;
            return;
        }
        ListNode curr = head;
        while (curr.next != null){
            curr = curr.next;
        }
        curr.next = newNode;
    }
}

其中,head表示链表的头节点,add方法用于向链表中插入一个节点。

链表的并集和交集

在实现链表的并集和交集之前,我们需要先实现两个链表的求交集。

链表的求交集

链表的求交集可以通过遍历两个链表,将它们的元素逐一比较来实现。示例代码如下:

public static LinkedList intersect(LinkedList list1, LinkedList list2){
    LinkedList result = new LinkedList();
    ListNode curr1 = list1.head;
    while (curr1 != null){
        ListNode curr2 = list2.head;
        while (curr2 != null){
            if(curr1.val == curr2.val){
                result.add(curr1.val);
                break;
            }
            curr2 = curr2.next;
        }
        curr1 = curr1.next;
    }
    return result;
}

其中,intersect方法用于求两个链表的交集,返回一个LinkedList类型的结果。

链表的求并集

链表的求并集可以通过遍历两个链表,将它们的元素逐一比较来实现。示例代码如下:

public static LinkedList union(LinkedList list1, LinkedList list2){
    LinkedList result = new LinkedList();
    ListNode curr1 = list1.head;
    while (curr1 != null){
        result.add(curr1.val);
        curr1 = curr1.next;
    }
    ListNode curr2 = list2.head;
    while (curr2 != null){
        boolean isExist = false;
        ListNode curr = result.head;
        while (curr != null){
            if(curr.val == curr2.val){
                isExist = true;
                break;
            }
            curr = curr.next;
        }
        if(!isExist){
            result.add(curr2.val);
        }
        curr2 = curr2.next;
    }
    return result;
}

其中,union方法用于求两个链表的并集,返回一个LinkedList类型的结果。

完整代码

完整的Java代码如下:

public class ListNode {
    int val;
    ListNode next;
    ListNode(int x) {
        val = x;
        next = null;
    }
}

public class LinkedList {
    ListNode head;

    // 在链表尾部插入一个节点
    public void add(int val){
        ListNode newNode = new ListNode(val);
        if(head == null){
            head = newNode;
            return;
        }
        ListNode curr = head;
        while (curr.next != null){
            curr = curr.next;
        }
        curr.next = newNode;
    }

    // 链表求交集
    public static LinkedList intersect(LinkedList list1, LinkedList list2){
        LinkedList result = new LinkedList();
        ListNode curr1 = list1.head;
        while (curr1 != null){
            ListNode curr2 = list2.head;
            while (curr2 != null){
                if(curr1.val == curr2.val){
                    result.add(curr1.val);
                    break;
                }
                curr2 = curr2.next;
            }
            curr1 = curr1.next;
        }
        return result;
    }

    // 链表求并集
    public static LinkedList union(LinkedList list1, LinkedList list2){
        LinkedList result = new LinkedList();
        ListNode curr1 = list1.head;
        while (curr1 != null){
            result.add(curr1.val);
            curr1 = curr1.next;
        }
        ListNode curr2 = list2.head;
        while (curr2 != null){
            boolean isExist = false;
            ListNode curr = result.head;
            while (curr != null){
                if(curr.val == curr2.val){
                    isExist = true;
                    break;
                }
                curr = curr.next;
            }
            if(!isExist){
                result.add(curr2.val);
            }
            curr2 = curr2.next;
        }
        return result;
    }
}
总结

本文介绍了如何使用Java语言实现两个链表的并集和交集。使用链表可以很方便地实现算法,同时也能展示Java语言的面向对象的特点。