Union and Intersection of two sorted arrays

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}
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.
Chapters
descriptions off, selected
captions settings, opens captions settings dialog
captions off, selected
English
default, selected
This is a modal window.
Beginning of dialog window. Escape will cancel and close the window.
End of dialog window.
Below is the implementation of the above approach : 
C++
C
Java
Python3
C#
PHP
Javascript
// 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 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 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);    }}
# 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]:            print(arr1[i],end=" ")            i += 1        elif arr2[j] < arr1[i]:            print(arr2[j],end=" ")            j+= 1        else:            print(arr2[j],end=" ")            j += 1            i += 1     # Print remaining elements of the larger array    while i < m:        print(arr1[i],end=" ")        i += 1     while j < n:        print(arr2[j],end=" ")        j += 1 # Driver program to test above functionarr1 = [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# 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 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 callingprintUnion($arr1, $arr2, $m, $n); // This code is contributed by Ajit.?>
<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>
1 2 3 4 5 6 7 
Time 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
Java
Python3
C#
Javascript
// 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 Codeint 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 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 Codeint 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 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 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:                print(arr1[i], end=' ')                prev = arr1[i]            i += 1        elif arr1[i] > arr2[j]:            if arr2[j] != prev:                print(arr2[j], end=' ')                prev = arr2[j]            j += 1        else:            if arr1[i] != prev:                print(arr1[i], end=' ')                prev = arr1[i]            i += 1            j += 1                 while i < m:        if arr1[i] != prev:            print(arr1[i], end=' ')            prev = arr1[i]        i += 1     while j < n:        if arr2[j] != prev:            print(arr2[j], end=' ')            prev = arr2[j]        j += 1     # Driver Codeif __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# 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.
<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>
1 2 3 4 5 
Time 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
1 2 3 4 5 
Time Complexity: O(m + n) where ‘m’ and ‘n’ are the size of the arraysAuxiliary 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 approachimport 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
Union is :
1 2 3 4 5 
Time Complexity: O(m + n) where ‘m’ and ‘n’ are the size of the arraysAuxiliary 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.
1 2 3 4 5 
Time 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
Java
Python3
C#
PHP
Javascript
// 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 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 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);    }}
# 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:            print(arr2[j],end=" ")            j += 1            i += 1 # Driver program to test above functionarr1 = [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# 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 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 callingprintIntersection($arr1, $arr2, $m, $n); // This code is contributed by anuj_67.?>
<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 codevar 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>
2 5 
Time 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++
Java
Python3
C#
Javascript
// 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 program to find intersection of two sorted arraysimport 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 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 Codeif __name__ == "__main__":     arr1 = [1, 2, 2, 3, 4]    arr2 = [2, 2, 4, 6, 7, 8]         l = IntersectionArray(arr1, arr2, len(arr1), len(arr2))    print(*l) # This code is contributed by Abhishek Kumar
// 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
<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>
2 4 
Time 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
2 5 
Time 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.
Union and Intersection of two sorted arrays | GeeksforGeeks - YouTubeGeeksforGeeks530K subscribersUnion and Intersection of two sorted arrays | GeeksforGeeksWatch laterShareCopy linkInfoShoppingTap to unmuteIf playback doesn't begin shortly, try restarting your device.You're signed outVideos you watch may be added to the TV's watch history and influence TV recommendations. To avoid this, cancel and sign in to YouTube on your computer.CancelConfirmMore videosMore videosSwitch cameraShareInclude playlistAn error occurred while retrieving sharing information. Please try again later.Watch on0:000:000:00 / 10:02•Live•<div class="player-unavailable"><h1 class="message">An error occurred.</h1><div class="submessage"><a href="https://www.youtube.com/watch?v=EQQp4B_CU5Q" target="_blank">Try watching this video on www.youtube.com</a>, or enable JavaScript if it is disabled in your browser.</div></div>
See following post for unsorted arrays. Find Union and Intersection of two unsorted arraysPlease write comments if you find any bug in above codes/algorithms, or find other ways to solve the same problem. 
 
 
 
jit_t
vt_m
shivyy
rituraj_jain
abhisaphire
arnavsharma2711
shivanisinghss2110
GauravRajput1
splevel62
init
amartyaghoshgfg
ciphersaini
shinjanpatra
aravasaiteja
goldentiger
codewithshinchan
adi1212
codewithrathi
krisania804
Merge Sort
Arrays
Arrays
Merge Sort
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Maximum and minimum of an array using minimum number of comparisons
Top 50 Array Coding Problems for Interviews
Multidimensional Arrays in Java
Stack Data Structure (Introduction and Program)
Linear Search
Introduction to Arrays
K'th Smallest/Largest Element in Unsorted Array | Set 1
Subset Sum Problem | DP-25
Introduction to Data Structures
Python | Using 2D arrays/lists the right way