# 算法设计：如何计算两个链表的并集和交集？

2021年3月19日13:58:41 发表评论 354 次浏览

## 本文概述

``````Input:
List1: 10->15->4->20
lsit2:  8->4->2->10
Output:
Intersection List: 4->10
Union List: 2->8->20->4->15->10``````

## C / C ++

``````// C/C++ program to find union
// and intersection of two unsorted
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
struct Node* next;
};

/* A utility function to insert a
node at the beginning ofa linked list*/
void push( struct Node** head_ref, int new_data);

/* A utility function to check if
given data is present in a list */
bool isPresent( struct Node* head, int data);

/* Function to get union of two
struct Node* getUnion(
{
struct Node* result = NULL;

// Insert all elements of
// list1 to the result list
while (t1 != NULL) {
push(&result, t1->data);
t1 = t1->next;
}

// Insert those elements of list2
// which are not present in result list
while (t2 != NULL) {
if (!isPresent(result, t2->data))
push(&result, t2->data);
t2 = t2->next;
}

return result;
}

/* Function to get intersection of
{
struct Node* result = NULL;

// Traverse list1 and search each element of it in
// list2. If the element is present in list 2, then
// insert the element to result
while (t1 != NULL) {
push(&result, t1->data);
t1 = t1->next;
}

return result;
}

/* A utility function to insert a
node at the beginning of a linked list*/
void push( struct Node** head_ref, int new_data)
{
/* allocate node */
struct Node* new_node
= ( struct Node*) malloc (
sizeof ( struct Node));

/* put in the data */
new_node->data = new_data;

/* link the old list off the new node */

/* move the head to point to the new node */
}

/* A utility function to print a linked list*/
void printList( struct Node* node)
{
while (node != NULL) {
printf ( "%d " , node->data);
node = node->next;
}
}

/* A utility function that returns true if data is
present in linked list else return false */
bool isPresent( struct Node* head, int data)
{
while (t != NULL) {
if (t->data == data)
return 1;
t = t->next;
}
return 0;
}

/* Driver program to test above function*/
int main()
{
struct Node* intersecn = NULL;
struct Node* unin = NULL;

/*create a linked lits 10->15->5->20 */

/*create a linked lits 8->4->2->10 */

printf ( "\n First list is \n" );

printf ( "\n Second list is \n" );

printf ( "\n Intersection list is \n" );
printList(intersecn);

printf ( "\n Union list is \n" );
printList(unin);

return 0;
}``````

## Java

``````// Java program to find union and
// intersection of two unsorted

class Node {
int data;
Node next;
Node( int d)
{
data = d;
next = null ;
}
}

/* Function to get Union of 2 Linked Lists */
{

// insert all elements of list1 in the result
while (t1 != null ) {
push(t1.data);
t1 = t1.next;
}

// insert those elements of list2
// that are not present
while (t2 != null ) {
push(t2.data);
t2 = t2.next;
}
}

{
Node result = null ;

// Traverse list1 and search each
// element of it in list2.
// If the element is present in
// list 2, then insert the
// element to result
while (t1 != null ) {
push(t1.data);
t1 = t1.next;
}
}

/* Utility function to print list */
void printList()
{
while (temp != null ) {
System.out.print(temp.data + " " );
temp = temp.next;
}
System.out.println();
}

/*  Inserts a node at start of linked list */
void push( int new_data)
{
/* 1 & 2: Allocate the Node &
Put in the data*/
Node new_node = new Node(new_data);

/* 3. Make next of new Node as head */

/* 4. Move the head to point to new Node */
}

/* A utilty function that returns true
if data is present in linked list
else return false */
{
while (t != null ) {
if (t.data == data)
return true ;
t = t.next;
}
return false ;
}

/* Driver program to test above functions */
public static void main(String args[])
{

/*create a linked lits 10->15->5->20 */
llist1.push( 20 );
llist1.push( 4 );
llist1.push( 15 );
llist1.push( 10 );

/*create a linked lits 8->4->2->10 */
llist2.push( 10 );
llist2.push( 2 );
llist2.push( 4 );
llist2.push( 8 );

System.out.println( "First List is" );
llist1.printList();

System.out.println( "Second List is" );
llist2.printList();

System.out.println( "Intersection List is" );
intersecn.printList();

System.out.println( "Union List is" );
unin.printList();
}
} /* This code is contributed by Rajat Mishra */``````

``````First list is
10 15 4 20
Second list is
8 4 2 10
Intersection list is
4 10
Union list is
2 8 20 4 15 10``````

• 时间复杂度：O(米* n)。
" m"和" n"分别是第一列表和第二列表中存在的元素数。
对于工会：对于list-2中的每个元素, 我们检查该元素是否已经存在于使用list-1生成的结果列表中。
对于交叉点：对于列表1中的每个元素, 我们检查该元素是否也存在于列表2中。
• 辅助空间：O(1)。
不使用任何数据结构来存储值。

1. 使用合并排序对第一个链表进行排序。此步骤需要O(mLogm)时间。参考这个帖子有关此步骤的详细信息。
2. 使用合并排序对第二个链表进行排序。此步骤需要O(nLogn)时间。参考这个帖子有关此步骤的详细信息。
3. 线性扫描两个排序列表以获取并集和交集。此步骤需要O(m + n)时间。可以使用与讨论的排序数组算法相同的算法来执行此步骤这里.

``````// Java code for Union and Intersection of two
import java.util.HashMap;
import java.util.HashSet;

class Node {
int data;
Node next;
Node( int d)
{
data = d;
next = null ;
}
}

/* Utility function to print list */
void printList()
{
while (temp != null ) {
System.out.print(temp.data + " " );
temp = temp.next;
}
System.out.println();
}

/* Inserts a node at start of linked list */
void push( int new_data)
{
/* 1 & 2: Allocate the Node &
Put in the data*/
Node new_node = new Node(new_data);

/* 3. Make next of new Node as head */

/* 4. Move the head to point to new Node */
}

public void append( int new_data)
{
if ( this .head == null ) {
Node n = new Node(new_data);
return ;
}
Node n2 = new Node(new_data);
while (n1.next != null ) {
n1 = n1.next;
}

n1.next = n2;
n2.next = null ;
}

/* A utilty function that returns true if data is
present in linked list else return false */
{
while (t != null ) {
if (t.data == data)
return true ;
t = t.next;
}
return false ;
}

{
HashSet<Integer> hset = new HashSet<>();

// loop stores all the elements of list1 in hset
while (n1 != null ) {
if (hset.contains(n1.data)) {
}
else {
}
n1 = n1.next;
}

// For every element of list2 present in hset
// loop inserts the element into the result
while (n2 != null ) {
if (hset.contains(n2.data)) {
result.push(n2.data);
}
n2 = n2.next;
}
return result;
}

{
// HashMap that will store the
// elements of the lists with their counts
HashMap<Integer, Integer> hmap = new HashMap<>();

// loop inserts the elements and the count of
// that element of list1 into the hmap
while (n1 != null ) {
if (hmap.containsKey(n1.data)) {
int val = hmap.get(n1.data);
hmap.put(n1.data, val + 1 );
}
else {
hmap.put(n1.data, 1 );
}
n1 = n1.next;
}

// loop further adds the elements of list2 with
// their counts into the hmap
while (n2 != null ) {
if (hmap.containsKey(n2.data)) {
int val = hmap.get(n2.data);
hmap.put(n2.data, val + 1 );
}
else {
hmap.put(n2.data, 1 );
}
n2 = n2.next;
}

// Eventually add all the elements
// into the result that are present in the hmap
for ( int a : hmap.keySet()) {
result.append(a);
}
return result;
}

/* Driver program to test above functions */
public static void main(String args[])
{

/*create a linked list 10->15->4->20 */
llist1.push( 20 );
llist1.push( 4 );
llist1.push( 15 );
llist1.push( 10 );

/*create a linked list 8->4->2->10 */
llist2.push( 10 );
llist2.push( 2 );
llist2.push( 4 );
llist2.push( 8 );

intersection

System.out.println( "First List is" );
llist1.printList();

System.out.println( "Second List is" );
llist2.printList();

System.out.println( "Intersection List is" );
intersection.printList();

System.out.println( "Union List is" );
union.printList();
}
}
// This code is contributed by Kamal Rawal``````

``````First List is
10 15 4 20
Second List is
8 4 2 10
Intersection List is
10 4
Union List is
2 4 20 8 10 15``````

• 时间复杂度：O(m + n)。
" m"和" n"分别是第一列表和第二列表中存在的元素数。
对于工会：遍历两个列表, 将元素存储在哈希图中并更新相应的计数。
对于交叉点：首先遍历list-1, 将其元素存储在Hash-map中, 然后对于list-2中的每个元素, 检查其是否已存在于地图中。这需要O(1)时间。
• 辅助空间：O(m + n)。
使用哈希图数据结构存储值。