Union and Intersection of two sorted arrays
- Difficulty Level : Easy
- Last Updated : 24 Jun, 2022
Given two sorted arrays, find their union and intersection.
Example:
Input : arr1[] = {1, 3, 4, 5, 7} arr2[] = {2, 3, 5, 6} Output : Union : {1, 2, 3, 4, 5, 6, 7} Intersection : {3, 5} Input : arr1[] = {2, 5, 6} arr2[] = {4, 6, 8, 10} Output : Union : {2, 4, 5, 6, 8, 10} Intersection : {6}
We strongly recommend that you click here and practice it, before moving on to the solution.
Union of arrays arr1[] and arr2[]
To find union of two sorted arrays, follow the following merge procedure :
1) Use two index variables i and j, initial values i = 0, j = 0
2) If arr1[i] is smaller than arr2[j] then print arr1[i] and increment i.
3) If arr1[i] is greater than arr2[j] then print arr2[j] and increment j.
4) If both are same then print any of them and increment both i and j.
5) Print remaining elements of the larger array.Below is the implementation of the above approach :
C++
// C++ program to find union of
// two sorted arrays
#include <bits/stdc++.h>
using
namespace
std;
/* Function prints union of arr1[] and arr2[]
m is the number of elements in arr1[]
n is the number of elements in arr2[] */
void
printUnion(
int
arr1[],
int
arr2[],
int
m,
int
n)
{
int
i = 0, j = 0;
while
(i < m && j < n) {
if
(arr1[i] < arr2[j])
cout << arr1[i++] <<
" "
;
else
if
(arr2[j] < arr1[i])
cout << arr2[j++] <<
" "
;
else
{
cout << arr2[j++] <<
" "
;
i++;
}
}
/* Print remaining elements of the larger array */
while
(i < m)
cout << arr1[i++] <<
" "
;
while
(j < n)
cout << arr2[j++] <<
" "
;
}
/* Driver program to test above function */
int
main()
{
int
arr1[] = { 1, 2, 4, 5, 6 };
int
arr2[] = { 2, 3, 5, 7 };
int
m =
sizeof
(arr1) /
sizeof
(arr1[0]);
int
n =
sizeof
(arr2) /
sizeof
(arr2[0]);
// Function calling
printUnion(arr1, arr2, m, n);
return
0;
}
C
// C program to find union of
// two sorted arrays
#include <stdio.h>
/* Function prints union of arr1[] and arr2[]
m is the number of elements in arr1[]
n is the number of elements in arr2[] */
void
printUnion(
int
arr1[],
int
arr2[],
int
m,
int
n)
{
int
i = 0, j = 0;
while
(i < m && j < n) {
if
(arr1[i] < arr2[j])
printf
(
" %d "
, arr1[i++]);
else
if
(arr2[j] < arr1[i])
printf
(
" %d "
, arr2[j++]);
else
{
printf
(
" %d "
, arr2[j++]);
i++;
}
}
/* Print remaining elements of the larger array */
while
(i < m)
printf
(
" %d "
, arr1[i++]);
while
(j < n)
printf
(
" %d "
, arr2[j++]);
}
/* Driver program to test above function */
int
main()
{
int
arr1[] = { 1, 2, 4, 5, 6 };
int
arr2[] = { 2, 3, 5, 7 };
int
m =
sizeof
(arr1) /
sizeof
(arr1[0]);
int
n =
sizeof
(arr2) /
sizeof
(arr2[0]);
printUnion(arr1, arr2, m, n);
getchar
();
return
0;
}
Java
// Java program to find union of
// two sorted arrays
class
FindUnion {
/* Function prints union of arr1[] and arr2[]
m is the number of elements in arr1[]
n is the number of elements in arr2[] */
static
int
printUnion(
int
arr1[],
int
arr2[],
int
m,
int
n)
{
int
i =
0
, j =
0
;
while
(i < m && j < n) {
if
(arr1[i] < arr2[j])
System.out.print(arr1[i++] +
" "
);
else
if
(arr2[j] < arr1[i])
System.out.print(arr2[j++] +
" "
);
else
{
System.out.print(arr2[j++] +
" "
);
i++;
}
}
/* Print remaining elements of
the larger array */
while
(i < m)
System.out.print(arr1[i++] +
" "
);
while
(j < n)
System.out.print(arr2[j++] +
" "
);
return
0
;
}
public
static
void
main(String args[])
{
int
arr1[] = {
1
,
2
,
4
,
5
,
6
};
int
arr2[] = {
2
,
3
,
5
,
7
};
int
m = arr1.length;
int
n = arr2.length;
printUnion(arr1, arr2, m, n);
}
}
Python3
# Python program to find union of
# two sorted arrays
# Function prints union of arr1[] and arr2[]
# m is the number of elements in arr1[]
# n is the number of elements in arr2[]
def
printUnion(arr1, arr2, m, n):
i, j
=
0
,
0
while
i < m
and
j < n:
if
arr1[i] < arr2[j]:
(arr1[i],end
=
" "
)
i
+
=
1
elif
arr2[j] < arr1[i]:
(arr2[j],end
=
" "
)
j
+
=
1
else
:
(arr2[j],end
=
" "
)
j
+
=
1
i
+
=
1
# Print remaining elements of the larger array
while
i < m:
(arr1[i],end
=
" "
)
i
+
=
1
while
j < n:
(arr2[j],end
=
" "
)
j
+
=
1
# Driver program to test above function
arr1
=
[
1
,
2
,
4
,
5
,
6
]
arr2
=
[
2
,
3
,
5
,
7
]
m
=
len
(arr1)
n
=
len
(arr2)
printUnion(arr1, arr2, m, n)
# This code is contributed by Pratik Chhajer
C#
// C# program to find union of
// two sorted arrays
using
System;
class
GFG {
/* Function prints union of arr1[] and arr2[]
m is the number of elements in arr1[]
n is the number of elements in arr2[] */
static
int
printUnion(
int
[] arr1,
int
[] arr2,
int
m,
int
n)
{
int
i = 0, j = 0;
while
(i < m && j < n) {
if
(arr1[i] < arr2[j])
Console.Write(arr1[i++] +
" "
);
else
if
(arr2[j] < arr1[i])
Console.Write(arr2[j++] +
" "
);
else
{
Console.Write(arr2[j++] +
" "
);
i++;
}
}
/* Print remaining elements of
the larger array */
while
(i < m)
Console.Write(arr1[i++] +
" "
);
while
(j < n)
Console.Write(arr2[j++] +
" "
);
return
0;
}
public
static
void
Main()
{
int
[] arr1 = { 1, 2, 4, 5, 6 };
int
[] arr2 = { 2, 3, 5, 7 };
int
m = arr1.Length;
int
n = arr2.Length;
printUnion(arr1, arr2, m, n);
}
}
// This code is contributed by Sam007
PHP
<?php
// PHP program to find union of
// two sorted arrays
/* Function prints union of
arr1[] and arr2[] m is the
number of elements in arr1[]
n is the number of elements
in arr2[] */
function
printUnion(
$arr1
,
$arr2
,
$m
,
$n
)
{
$i
= 0;
$j
= 0;
while
(
$i
<
$m
&&
$j
<
$n
)
{
if
(
$arr1
[
$i
] <
$arr2
[
$j
])
echo
(
$arr1
[
$i
++] .
" "
);
else
if
(
$arr2
[
$j
] <
$arr1
[
$i
])
echo
(
$arr2
[
$j
++] .
" "
);
else
{
echo
(
$arr2
[
$j
++] .
" "
);
$i
++;
}
}
// Print remaining elements
// of the larger array
while
(
$i
<
$m
)
echo
(
$arr1
[
$i
++] .
" "
);
while
(
$j
<
$n
)
echo
(
$arr2
[
$j
++] .
" "
);
}
// Driver Code
$arr1
=
array
(1, 2, 4, 5, 6);
$arr2
=
array
(2, 3, 5, 7);
$m
= sizeof(
$arr1
);
$n
= sizeof(
$arr2
);
// Function calling
printUnion(
$arr1
,
$arr2
,
$m
,
$n
);
// This code is contributed by Ajit.
?>
Javascript
<script>
// JavaScript program to find union of
// two sorted arrays
/* Function prints union of arr1[] and arr2[]
m is the number of elements in arr1[]
n is the number of elements in arr2[] */
function
printUnion( arr1, arr2, m, n)
{
var
i = 0, j = 0;
while
(i < m && j < n) {
if
(arr1[i] < arr2[j])
document.write(arr1[i++] +
" "
);
else
if
(arr2[j] < arr1[i])
document.write(arr2[j++] +
" "
);
else
{
document.write(arr2[j++] +
" "
);
i++;
}
}
/* Print remaining elements of
the larger array */
while
(i < m)
document.write(arr1[i++] +
" "
);
while
(j < n)
document.write(arr2[j++] +
" "
);
return
0;
}
var
arr1 = [ 1, 2, 4, 5, 6 ];
var
arr2 = [ 2, 3, 5, 7 ];
var
m = arr1.length;
var
n = arr2.length;
printUnion(arr1, arr2, m, n);
// this code is contributed by shivanisinghss2110
</script>
Output1 2 3 4 5 6 7Time Complexity : O(m + n)
Auxiliary Space: O(1)Handling duplicates in any of the array : Above code does not handle duplicates in any of the array. To handle the duplicates, just check for every element whether adjacent elements are equal.
Below is the implementation of this approach.
C++
// C++ program for the above approach
#include <bits/stdc++.h>
using
namespace
std;
static
void
UnionArray(
int
arr1[],
int
arr2[],
int
l1,
int
l2)
{
// Taking max element present in either array
int
m = arr1[l1 - 1];
int
n = arr2[l2 - 1];
int
ans = 0;
if
(m > n)
ans = m;
else
ans = n;
// Finding elements from 1st array (non duplicates
// only). Using another array for storing union elements
// of both arrays Assuming max element present in array
// is not more than 10^7
int
newtable[ans + 1];
memset
(newtable, 0,
sizeof
(newtable));
// First element is always present in final answer
cout << arr1[0] <<
" "
;
// Incrementing the First element's count in it's
// corresponding index in newtable
++newtable[arr1[0]];
// Starting traversing the first array from 1st index
// till last
for
(
int
i = 1; i < l1; i++) {
// Checking whether current element is not equal to
// it's previous element
if
(arr1[i] != arr1[i - 1]) {
cout << arr1[i] <<
" "
;
++newtable[arr1[i]];
}
}
// Finding only non common elements from 2nd array
for
(
int
j = 0; j < l2; j++) {
// By checking whether it's already resent in
// newtable or not
if
(newtable[arr2[j]] == 0) {
cout << arr2[j] <<
" "
;
++newtable[arr2[j]];
}
}
}
// Driver Code
int
main()
{
int
arr1[] = { 1, 2, 2, 2, 3 };
int
arr2[] = { 2, 3, 4, 5 };
int
n =
sizeof
(arr1) /
sizeof
(arr1[0]);
int
m =
sizeof
(arr2) /
sizeof
(arr2[0]);
UnionArray(arr1, arr2, n, m);
return
0;
}
// This code is contributed by Sania Kumari Gupta (kriSania804)
C
// C program for the above approach
#include <stdio.h>
#include <string.h>
static
void
UnionArray(
int
arr1[],
int
arr2[],
int
l1,
int
l2)
{
// Taking max element present in either array
int
m = arr1[l1 - 1];
int
n = arr2[l2 - 1];
int
ans = 0;
if
(m > n)
ans = m;
else
ans = n;
// Finding elements from 1st array (non duplicates
// only). Using another array for storing union elements
// of both arrays Assuming max element present in array
// is not more than 10^7
int
newtable[ans + 1];
for
(
int
i = 0; i < ans + 1; i++)
newtable[i] = 0;
// First element is always present in final answer
printf
(
"%d "
, arr1[0]);
// Incrementing the First element's count in it's
// corresponding index in newtable
++newtable[arr1[0]];
// Starting traversing the first array from 1st index
// till last
for
(
int
i = 1; i < l1; i++) {
// Checking whether current element is not equal to
// it's previous element
if
(arr1[i] != arr1[i - 1]) {
printf
(
"%d "
, arr1[i]);
++newtable[arr1[i]];
}
}
// Finding only non common elements from 2nd array
for
(
int
j = 0; j < l2; j++) {
// By checking whether it's already resent in
// newtable or not
if
(newtable[arr2[j]] == 0) {
printf
(
"%d "
, arr2[j]);
++newtable[arr2[j]];
}
}
}
// Driver Code
int
main()
{
int
arr1[] = { 1, 2, 2, 2, 3 };
int
arr2[] = { 2, 3, 4, 5 };
int
n =
sizeof
(arr1) /
sizeof
(arr1[0]);
int
m =
sizeof
(arr2) /
sizeof
(arr2[0]);
UnionArray(arr1, arr2, n, m);
return
0;
}
// This code is contributed by Sania Kumari Gupta (kriSania804)
Java
// Java program to find union of two
// sorted arrays (Handling Duplicates)
class
FindUnion {
static
void
UnionArray(
int
arr1[],
int
arr2[])
{
// Taking max element present in either array
int
m = arr1[arr1.length -
1
];
int
n = arr2[arr2.length -
1
];
int
ans =
0
;
if
(m > n) {
ans = m;
}
else
ans = n;
// Finding elements from 1st array
// (non duplicates only). Using
// another array for storing union
// elements of both arrays
// Assuming max element present
// in array is not more than 10^7
int
newtable[] =
new
int
[ans +
1
];
// First element is always
// present in final answer
System.out.print(arr1[
0
] +
" "
);
// Incrementing the First element's count
// in it's corresponding index in newtable
++newtable[arr1[
0
]];
// Starting traversing the first
// array from 1st index till last
for
(
int
i =
1
; i < arr1.length; i++) {
// Checking whether current element
// is not equal to it's previous element
if
(arr1[i] != arr1[i -
1
]) {
System.out.print(arr1[i] +
" "
);
++newtable[arr1[i]];
}
}
// Finding only non common
// elements from 2nd array
for
(
int
j =
0
; j < arr2.length; j++) {
// By checking whether it's already
// present in newtable or not
if
(newtable[arr2[j]] ==
0
) {
System.out.print(arr2[j] +
" "
);
++newtable[arr2[j]];
}
}
}
// Driver Code
public
static
void
main(String args[])
{
int
arr1[] = {
1
,
2
,
2
,
2
,
3
};
int
arr2[] = {
2
,
3
,
4
,
5
};
UnionArray(arr1, arr2);
}
}
Python3
# Python3 program to find union of two
# sorted arrays (Handling Duplicates)
def
union_array(arr1, arr2):
m
=
len
(arr1)
n
=
len
(arr2)
i
=
0
j
=
0
# keep track of last element to avoid duplicates
prev
=
None
while
i < m
and
j < n:
if
arr1[i] < arr2[j]:
if
arr1[i] !
=
prev:
(arr1[i], end
=
' '
)
prev
=
arr1[i]
i
+
=
1
elif
arr1[i] > arr2[j]:
if
arr2[j] !
=
prev:
(arr2[j], end
=
' '
)
prev
=
arr2[j]
j
+
=
1
else
:
if
arr1[i] !
=
prev:
(arr1[i], end
=
' '
)
prev
=
arr1[i]
i
+
=
1
j
+
=
1
while
i < m:
if
arr1[i] !
=
prev:
(arr1[i], end
=
' '
)
prev
=
arr1[i]
i
+
=
1
while
j < n:
if
arr2[j] !
=
prev:
(arr2[j], end
=
' '
)
prev
=
arr2[j]
j
+
=
1
# Driver Code
if
__name__
=
=
"__main__"
:
arr1
=
[
1
,
2
,
2
,
2
,
3
]
arr2
=
[
2
,
3
,
4
,
5
]
union_array(arr1, arr2)
# This code is contributed by Sanjay Kumar
C#
// C# program to find union of two
// sorted arrays (Handling Duplicates)
using
System;
class
GFG {
static
void
UnionArray(
int
[] arr1,
int
[] arr2)
{
// Taking max element present
// in either array
int
m = arr1[arr1.Length - 1];
int
n = arr2[arr2.Length - 1];
int
ans = 0;
if
(m > n)
ans = m;
else
ans = n;
// Finding elements from 1st array
// (non duplicates only). Using
// another array for storing union
// elements of both arrays
// Assuming max element present
// in array is not more than 10^7
int
[] newtable =
new
int
[ans + 1];
// First element is always
// present in final answer
Console.Write(arr1[0] +
" "
);
// Incrementing the First element's
// count in it's corresponding
// index in newtable
++newtable[arr1[0]];
// Starting traversing the first
// array from 1st index till last
for
(
int
i = 1; i < arr1.Length; i++) {
// Checking whether current
// element is not equal to
// it's previous element
if
(arr1[i] != arr1[i - 1]) {
Console.Write(arr1[i] +
" "
);
++newtable[arr1[i]];
}
}
// Finding only non common
// elements from 2nd array
for
(
int
j = 0; j < arr2.Length; j++) {
// By checking whether it's already
// present in newtable or not
if
(newtable[arr2[j]] == 0) {
Console.Write(arr2[j] +
" "
);
++newtable[arr2[j]];
}
}
}
// Driver Code
public
static
void
Main()
{
int
[] arr1 = { 1, 2, 2, 2, 3 };
int
[] arr2 = { 2, 3, 4, 5 };
UnionArray(arr1, arr2);
}
}
// This code is contributed by anuj_67.
Javascript
<script>
// javascript program to find union of two
// sorted arrays (Handling Duplicates)
function
UnionArray(arr1 , arr2) {
// Taking max element present in either array
var
m = arr1[arr1.length - 1];
var
n = arr2[arr2.length - 1];
var
ans = 0;
if
(m > n) {
ans = m;
}
else
ans = n;
// Finding elements from 1st array
// (non duplicates only). Using
// another array for storing union
// elements of both arrays
// Assuming max element present
// in array is not more than 10^7
var
newtable = Array(ans+1).fill(0);
// First element is always
// present in final answer
document.write(arr1[0] +
" "
);
// Incrementing the First element's count
// in it's corresponding index in newtable
newtable[arr1[0]]+=1;
// Starting traversing the first
// array from 1st index till last
for
(
var
i = 1; i < arr1.length; i++) {
// Checking whether current element
// is not equal to it's previous element
if
(arr1[i] != arr1[i - 1]) {
document.write(arr1[i] +
" "
);
newtable[arr1[i]]+= 1;
}
}
// Finding only non common
// elements from 2nd array
for
(
var
j = 0; j < arr2.length; j++) {
// By checking whether it's already
// present in newtable or not
if
(newtable[arr2[j]] == 0) {
document.write(arr2[j] +
" "
);
++newtable[arr2[j]];
}
}
}
// Driver Code
var
arr1 = [ 1, 2, 2, 2, 3 ];
var
arr2 = [ 2, 3, 4, 5 ];
UnionArray(arr1, arr2);
// This code is contributed by gauravrajput1
</script>
Output1 2 3 4 5Time Complexity: O(l1 + l2)
Auxiliary Space: O(n)Thanks to Sanjay Kumar for suggesting this solution.
Another Approach using TreeSet in Java: The idea of the approach is to build a TreeSet and insert all the elements from both arrays into it. As a tree set stores only unique values, it will only keep all the unique values of both arrays.
Below is the implementation of the approach.
Java
// Java code to implement the approach
import
java.io.*;
import
java.util.*;
class
GFG {
// Function to return the union of two arrays
public
static
ArrayList<Integer>
Unionarray(
int
arr1[],
int
arr2[],
int
n,
int
m)
{
TreeSet<Integer> set =
new
TreeSet<>();
// Remove the duplicates from arr1[]
for
(
int
i : arr1)
set.add(i);
// Remove duplicates from arr2[]
for
(
int
i : arr2)
set.add(i);
// Loading set to array list
ArrayList<Integer> list
=
new
ArrayList<>();
for
(
int
i : set)
list.add(i);
return
list;
}
// Driver code
public
static
void
main(String[] args)
{
int
arr1[] = {
1
,
2
,
2
,
2
,
3
};
int
arr2[] = {
2
,
3
,
3
,
4
,
5
,
5
};
int
n = arr1.length;
int
m = arr2.length;
// Function call
ArrayList<Integer> uni
= Unionarray(arr1, arr2, n, m);
for
(
int
i : uni) {
System.out.print(i +
" "
);
}
}
}
// Contributed by ARAVA SAI TEJA
Output1 2 3 4 5Time Complexity: O(m + n) where ‘m’ and ‘n’ are the size of the arrays
Auxiliary Space: O(m + n)Thanks to Arava Sai Teja for suggesting this solution.
Another Approach using HashMap in Java: The idea of the approach is to build a HashMap and insert all the elements. As a HashMap has complexity of O(1) for insertion and lookup.
Below is the implementation of the approach.
Java
// Java code to implement the approach
import
java.io.*;
import
java.util.*;
import
java.util.HashMap;
class
GFG {
// Function to return the union of two arrays
public
static
ArrayList<Integer>
Unionarray(
int
arr1[],
int
arr2[],
int
n,
int
m)
{
HashMap<Integer, Integer> map =
new
HashMap<Integer, Integer>();
// Remove the duplicates from arr1[]
for
(
int
i =
0
;i<arr1.length;i++)
{
if
(map.containsKey(arr1[i]))
{
map.put(arr1[i], map.get(arr1[i]) +
1
);
}
else
{
map.put(arr1[i],
1
);
}
}
// Remove duplicates from arr2[]
for
(
int
i =
0
;i<arr2.length;i++)
{
if
(map.containsKey(arr2[i]))
{
map.put(arr2[i], map.get(arr2[i]) +
1
);
}
else
{
map.put(arr2[i],
1
);
}
}
// Loading set to array list
ArrayList<Integer> list =
new
ArrayList<>();
for
(
int
i : map.keySet())
{
list.add(i);;
}
return
list;
}
// Driver code
public
static
void
main(String[] args)
{
int
arr1[] = {
1
,
2
,
2
,
2
,
3
};
int
arr2[] = {
2
,
3
,
3
,
4
,
5
,
5
};
int
n = arr1.length;
int
m = arr2.length;
System.out.println(
"Union is :"
);
// Function call
ArrayList<Integer> uni
= Unionarray(arr1, arr2, n, m);
for
(
int
i : uni) {
System.out.print(i +
" "
);
}
}
}
// This code is contributed by Aarti_Rathi
OutputUnion is : 1 2 3 4 5Time Complexity: O(m + n) where ‘m’ and ‘n’ are the size of the arrays
Auxiliary Space: O(m + n)Thanks to Aarti Rathi for suggesting this solution.
Another optimized approach: In the above code we use some extra auxiliary space by creating newtable[ ]. We can reduce the space complexity program to test above function to constant by checking adjacent elements when incrementing i or j such that i or j directly move to the next distinct element. We can perform this operation in-place (i.e. without using any extra space).
C++
// This implementation uses vectors but can be easily modified to adapt arrays
#include <bits/stdc++.h>
using
namespace
std;
/* Helper function for printUnion().
This same function can also be implemented as a lambda function inside printUnion().
*/
void
next_distinct(
const
vector<
int
> &arr,
int
&x)
// Moving to next distinct element
{
// vector CAN be passed by reference to avoid unnecessary copies.
// x(index) MUST be passed by reference so to reflect the change in the original index parameter
/* Checks whether the previous element is equal to the current element,
if true move to the element at the next index else return with the current index
*/
do
{
++x;
}
while
(x < arr.size() && arr[x - 1] == arr[x]);
}
void
printUnion(vector<
int
> arr1, vector<
int
> arr2)
{
int
i = 0, j = 0;
while
(i < arr1.size() && j < arr2.size())
{
if
(arr1[i] < arr2[j])
{
cout << arr1[i] <<
" "
;
next_distinct(arr1, i);
// Incrementing i to next distinct element
}
else
if
(arr1[i] > arr2[j])
{
cout << arr2[j] <<
" "
;
next_distinct(arr2, j);
// Incrementing j to next distinct element
}
else
{
cout << arr1[i] <<
" "
;
// OR cout << arr2[j] << " ";
next_distinct(arr1, i);
// Incrementing i to next distinct element
next_distinct(arr2, j);
// Incrementing j to next distinct element
}
}
// Remaining elements of the larger array
while
(i < arr1.size())
{
cout << arr1[i] <<
" "
;
next_distinct(arr1, i);
// Incrementing i to next distinct element
}
while
(j < arr2.size())
{
cout << arr2[j] <<
" "
;
next_distinct(arr2, j);
// Incrementing j to next distinct element
}
}
int
main()
{
vector<
int
> arr1 = {1, 2, 2, 2, 3};
// Duplicates Present
vector<
int
> arr2 = {2, 3, 3, 4, 5, 5};
// Duplicates Present
printUnion(arr1, arr2);
return
0;
}
// This code is contributed by ciphersaini.
Output1 2 3 4 5Time Complexity:
where m & n are the sizes of the arrays.
Auxiliary Space:Intersection of arrays arr1[] and arr2[]
To find intersection of 2 sorted arrays, follow the below approach :
1) Use two index variables i and j, initial values i = 0, j = 0
2) If arr1[i] is smaller than arr2[j] then increment i.
3) If arr1[i] is greater than arr2[j] then increment j.
4) If both are same then print any of them and increment both i and j.Below is the implementation of the above approach :
C++
// C++ program to find intersection of
// two sorted arrays
#include <bits/stdc++.h>
using
namespace
std;
/* Function prints Intersection of arr1[] and arr2[]
m is the number of elements in arr1[]
n is the number of elements in arr2[] */
void
printIntersection(
int
arr1[],
int
arr2[],
int
m,
int
n)
{
int
i = 0, j = 0;
while
(i < m && j < n) {
if
(arr1[i] < arr2[j])
i++;
else
if
(arr2[j] < arr1[i])
j++;
else
/* if arr1[i] == arr2[j] */
{
cout << arr2[j] <<
" "
;
i++;
j++;
}
}
}
/* Driver program to test above function */
int
main()
{
int
arr1[] = { 1, 2, 4, 5, 6 };
int
arr2[] = { 2, 3, 5, 7 };
int
m =
sizeof
(arr1) /
sizeof
(arr1[0]);
int
n =
sizeof
(arr2) /
sizeof
(arr2[0]);
// Function calling
printIntersection(arr1, arr2, m, n);
return
0;
}
C
// C program to find intersection of
// two sorted arrays
#include <stdio.h>
/* Function prints Intersection of arr1[] and arr2[]
m is the number of elements in arr1[]
n is the number of elements in arr2[] */
void
printIntersection(
int
arr1[],
int
arr2[],
int
m,
int
n)
{
int
i = 0, j = 0;
while
(i < m && j < n) {
if
(arr1[i] < arr2[j])
i++;
else
if
(arr2[j] < arr1[i])
j++;
else
/* if arr1[i] == arr2[j] */
{
printf
(
" %d "
, arr2[j++]);
i++;
}
}
}
/* Driver program to test above function */
int
main()
{
int
arr1[] = { 1, 2, 4, 5, 6 };
int
arr2[] = { 2, 3, 5, 7 };
int
m =
sizeof
(arr1) /
sizeof
(arr1[0]);
int
n =
sizeof
(arr2) /
sizeof
(arr2[0]);
printIntersection(arr1, arr2, m, n);
getchar
();
return
0;
}
Java
// Java program to find intersection of
// two sorted arrays
class
FindIntersection {
/* Function prints Intersection of arr1[] and arr2[]
m is the number of elements in arr1[]
n is the number of elements in arr2[] */
static
void
printIntersection(
int
arr1[],
int
arr2[],
int
m,
int
n)
{
int
i =
0
, j =
0
;
while
(i < m && j < n) {
if
(arr1[i] < arr2[j])
i++;
else
if
(arr2[j] < arr1[i])
j++;
else
{
System.out.print(arr2[j++] +
" "
);
i++;
}
}
}
public
static
void
main(String args[])
{
int
arr1[] = {
1
,
2
,
4
,
5
,
6
};
int
arr2[] = {
2
,
3
,
5
,
7
};
int
m = arr1.length;
int
n = arr2.length;
printIntersection(arr1, arr2, m, n);
}
}
Python3
# Python program to find intersection of
# two sorted arrays
# Function prints Intersection of arr1[] and arr2[]
# m is the number of elements in arr1[]
# n is the number of elements in arr2[]
def
printIntersection(arr1, arr2, m, n):
i, j
=
0
,
0
while
i < m
and
j < n:
if
arr1[i] < arr2[j]:
i
+
=
1
elif
arr2[j] < arr1[i]:
j
+
=
1
else
:
(arr2[j],end
=
" "
)
j
+
=
1
i
+
=
1
# Driver program to test above function
arr1
=
[
1
,
2
,
4
,
5
,
6
]
arr2
=
[
2
,
3
,
5
,
7
]
m
=
len
(arr1)
n
=
len
(arr2)
printIntersection(arr1, arr2, m, n)
# This code is contributed by Pratik Chhajer
C#
// C# program to find Intersection of
// two sorted arrays
using
System;
class
GFG {
/* Function prints Intersection of arr1[]
and arr2[] m is the number of elements in arr1[]
n is the number of elements in arr2[] */
static
void
printIntersection(
int
[] arr1,
int
[] arr2,
int
m,
int
n)
{
int
i = 0, j = 0;
while
(i < m && j < n) {
if
(arr1[i] < arr2[j])
i++;
else
if
(arr2[j] < arr1[i])
j++;
else
{
Console.Write(arr2[j++] +
" "
);
i++;
}
}
}
// driver code
public
static
void
Main()
{
int
[] arr1 = { 1, 2, 4, 5, 6 };
int
[] arr2 = { 2, 3, 5, 7 };
int
m = arr1.Length;
int
n = arr2.Length;
printIntersection(arr1, arr2, m, n);
}
}
// This code is contributed by Sam007
PHP
<?php
// PHP program to find intersection of
// two sorted arrays
/* Function prints Intersection
of arr1[] and arr2[] m is the
number of elements in arr1[]
n is the number of elements
in arr2[] */
function
printIntersection(
$arr1
,
$arr2
,
$m
,
$n
)
{
$i
= 0 ;
$j
= 0;
while
(
$i
<
$m
&&
$j
<
$n
)
{
if
(
$arr1
[
$i
] <
$arr2
[
$j
])
$i
++;
else
if
(
$arr2
[
$j
] <
$arr1
[
$i
])
$j
++;
/* if arr1[i] == arr2[j] */
else
{
echo
$arr2
[
$j
],
" "
;
$i
++;
$j
++;
}
}
}
// Driver Code
$arr1
=
array
(1, 2, 4, 5, 6);
$arr2
=
array
(2, 3, 5, 7);
$m
=
count
(
$arr1
);
$n
=
count
(
$arr2
);
// Function calling
printIntersection(
$arr1
,
$arr2
,
$m
,
$n
);
// This code is contributed by anuj_67.
?>
Javascript
<script>
// JavaScript program to find intersection of
// two sorted arrays
// Function prints Intersection of arr1[] and arr2[]
// m is the number of elements in arr1[]
// n is the number of elements in arr2[]
function
printIntersection(arr1, arr2, m, n)
{
var
i = 0, j = 0;
while
(i < m && j < n)
{
if
(arr1[i] < arr2[j])
i++;
else
if
(arr2[j] < arr1[i])
j++;
else
{
document.write(arr2[j++] +
" "
);
i++;
}
}
}
// Driver code
var
arr1 = [ 1, 2, 4, 5, 6 ];
var
arr2 = [ 2, 3, 5, 7 ];
var
m = arr1.length;
var
n = arr2.length;
printIntersection(arr1, arr2, m, n);
// This code is contributed by shivanisinghss2110
</script>
Output2 5Time Complexity : O(m + n)
Auxiliary Space: O(1)Handling duplicate in Arrays :
Above code does not handle duplicate elements in arrays. The intersection should not count duplicate elements. To handle duplicates just check whether current element is already present in intersection list. Below is the implementation of this approach.C++
// C++ program to find intersection of two sorted arrays
#include <bits/stdc++.h>
using
namespace
std;
/* Function prints Intersection of arr1[] and arr2[]
m is the number of elements in arr1[]
n is the number of elements in arr2[] */
void
print_intersection(
int
arr1[],
int
arr2[],
int
m,
int
n)
{
int
i = 0, j = 0;
set<
int
> s;
//set for handling duplicate elements in intersection list
while
(i < m && j < n) {
if
(arr1[i] < arr2[j])
i++;
else
if
(arr2[j] < arr1[i])
j++;
else
/* if arr1[i] == arr2[j] */
{
s.insert(arr2[j]);
//insertion in set s
i++;
j++;
}
}
for
(
auto
itr: s)
//printing intersection set list
{
cout<<itr<<
" "
;
}
}
/* Driver code */
int
main()
{
int
arr1[] = { 1, 2, 2, 3, 4 };
int
arr2[] = { 2, 2, 4, 6, 7, 8 };
int
m =
sizeof
(arr1) /
sizeof
(arr1[0]);
int
n =
sizeof
(arr2) /
sizeof
(arr2[0]);
// Function calling
print_intersection(arr1, arr2, m, n);
return
0;
}
// This code is contributed by Goldentiger.
Java
// Java program to find intersection of two sorted arrays
import
java.io.*;
import
java.util.*;
class
Print_Intersection {
/* Function prints Intersection of arr1[] and arr2[]
m is the number of elements in arr1[]
n is the number of elements in arr2[] */
static
void
print_intersection(
int
arr1[],
int
arr2[],
int
m,
int
n)
{
// set for handling duplicate elements in
// intersection list
Set<Integer> s =
new
TreeSet<Integer>();
int
i =
0
, j =
0
;
while
(i < m && j < n) {
if
(arr1[i] < arr2[j])
i++;
else
if
(arr2[j] < arr1[i])
j++;
else
{
s.add(arr2[j++]);
// insertion in set s
i++;
}
}
for
(
int
element :
s)
// printing intersection set list
{
System.out.print(element +
" "
);
}
System.out.println(
""
);
}
public
static
void
main(String args[])
{
int
arr1[] = {
1
,
2
,
2
,
3
,
4
};
int
arr2[] = {
2
,
2
,
4
,
6
,
7
,
8
};
int
m = arr1.length;
int
n = arr2.length;
print_intersection(arr1, arr2, m, n);
}
}
// This code is contributed by CipherBhandari
Python3
# Python3 program to find Intersection of two
# Sorted Arrays (Handling Duplicates)
def
IntersectionArray(a, b, n, m):
'''
:param a: given sorted array a
:param n: size of sorted array a
:param b: given sorted array b
:param m: size of sorted array b
:return: array of intersection of two array or -1
'''
Intersection
=
[]
i
=
j
=
0
while
i < n
and
j < m:
if
a[i]
=
=
b[j]:
# If duplicate already present in Intersection list
if
len
(Intersection) >
0
and
Intersection[
-
1
]
=
=
a[i]:
i
+
=
1
j
+
=
1
# If no duplicate is present in Intersection list
else
:
Intersection.append(a[i])
i
+
=
1
j
+
=
1
elif
a[i] < b[j]:
i
+
=
1
else
:
j
+
=
1
if
not
len
(Intersection):
return
[
-
1
]
return
Intersection
# Driver Code
if
__name__
=
=
"__main__"
:
arr1
=
[
1
,
2
,
2
,
3
,
4
]
arr2
=
[
2
,
2
,
4
,
6
,
7
,
8
]
l
=
IntersectionArray(arr1, arr2,
len
(arr1),
len
(arr2))
(
*
l)
# This code is contributed by Abhishek Kumar
C#
// C# program to find Intersection of
// two sorted arrays
using
System;
using
System.Collections.Generic;
class
GFG {
/* Function prints Intersection of arr1[] and arr2[]
m is the number of elements in arr1[]
n is the number of elements in arr2[] */
static
void
print_intersection(
int
[]arr1,
int
[]arr2,
int
m,
int
n)
{
int
i = 0, j = 0;
HashSet<
int
> s =
new
HashSet<
int
>();
//set for handling duplicate elements in intersection list
while
(i < m && j < n) {
if
(arr1[i] < arr2[j])
i++;
else
if
(arr2[j] < arr1[i])
j++;
else
/* if arr1[i] == arr2[j] */
{
s.Add(arr2[j]);
//insertion in set s
i++;
j++;
}
}
foreach
(
int
k
in
s)
//printing intersection set list
{
Console.Write(k +
" "
);
}
}
// driver code
public
static
void
Main()
{
int
[] arr1 = { 1, 2, 2, 3, 4 };
int
[] arr2 = { 2, 2, 4, 6, 7, 8};
int
m = arr1.Length;
int
n = arr2.Length;
print_intersection(arr1, arr2, m, n);
}
}
// This code is contributed by Aarti_Rathi
Javascript
<script>
// Python3 program to find Intersection of two
// Sorted Arrays (Handling Duplicates)
function
IntersectionArray(a, b, n, m){
// :param a: given sorted array a
// :param n: size of sorted array a
// :param b: given sorted array b
// :param m: size of sorted array b
// :return: array of intersection of two array or -1
Intersection = []
let i = j = 0
while
(i < n && j < m){
if
(a[i] == b[j]){
// If duplicate already present in Intersection list
if
(Intersection.length > 0 && Intersection[Intersection.length-1] == a[i]){
i+= 1
j+= 1
}
// If no duplicate is present in Intersection list
else
{
Intersection.push(a[i])
i+= 1
j+= 1
}
}
else
if
(a[i] < b[j])
i+= 1
else
j+= 1
}
if
(!Intersection.length)
return
[-1]
return
Intersection
}
// Driver Code
let arr1 = [1, 2, 2, 3, 4]
let arr2 = [2, 2, 4, 6, 7, 8]
let l = IntersectionArray(arr1, arr2, arr1.length, arr2.length)
document.write(l)
// This code is contributed by shinjanpatra
</script>
Output2 4Time Complexity : O(m + n)
Auxiliary Space : O(min(m, n))Another Approach using Tree Set: The idea of this approach is to build a tree set to store the unique elements of arri[]. Then compare the elements arr2[] with the tree set and also check if that is considered in the intersection to avoid duplicates.
Below is the implementation of the approach.
Java
// Java code to implement the approach
import
java.io.*;
import
java.util.*;
class
GFG {
// Function to find the intersection
// of two arrays
public
static
ArrayList<Integer>
Intersection(
int
arr1[],
int
arr2[],
int
n,
int
m)
{
TreeSet<Integer> set =
new
TreeSet<>();
// Removing duplicates from first array
for
(
int
i : arr1)
set.add(i);
ArrayList<Integer> list
=
new
ArrayList<>();
// Avoiding duplicates and
// adding intersections
for
(
int
i : arr2)
if
(set.contains(i)
&& !list.contains(i))
list.add(i);
// Sorting
Collections.sort(list);
return
list;
}
// Driver code
public
static
void
main(String[] args)
{
int
arr1[] = {
1
,
2
,
4
,
5
,
6
};
int
arr2[] = {
2
,
3
,
5
,
7
};
int
n = arr1.length;
int
m = arr2.length;
// Function call
ArrayList<Integer> inter
= Intersection(arr1, arr2, n, m);
for
(
int
i : inter) {
System.out.print(i +
" "
);
}
}
}
// Contributed by ARAVA SAI TEJA
Output2 5Time Complexity: O(m+n)
Auxiliary Space: O(m+n)Thanks to Arava Sai Teja for suggesting this solution.
Another approach that is useful when difference between sizes of two given arrays is significant.
The idea is to iterate through the shorter array and do a binary search for every element of short array in big array (note that arrays are sorted). Time complexity of this solution is O(min(mLogn, nLogm)). This solution works better than the above approach when ratio of larger length to smaller is more than logarithmic order.See following post for unsorted arrays.
Find Union and Intersection of two unsorted arrays
Please write comments if you find any bug in above codes/algorithms, or find other ways to solve the same problem.
My Personal Notes arrow_drop_upRecommended ArticlesPage :Article Contributed By :Improved By :Article Tags :Practice Tags :