Open In App

Find the element in a linked list with frequency at least N/3

Last Updated : 19 Jul, 2022
Summarize
Comments
Improve
Suggest changes
Share
Like Article
Like
Report

Given a linked list of size N consisting of a string as node value, the task is to find the majority string, having frequency greater than [N/3], in the linked list. 

Note: It is guaranteed that there is only one majority string.

Examples:  

Input: head -> geeks -> geeks -> abcd -> game -> knight -> geeks -> harry. 
Output: geeks. 
Explanation: 
The frequency of geeks string in link list is 3 which is greater than [7/3] i.e 2.

Input: head -> hot -> hot -> cold -> hot -> hot 
Output: hot 
Explanation: 
The frequency of hot string in the link list is 4 which is greater than [5/3] i.e 1. 

Naive Approach: 
Store the frequency of every string in a Map. Traverse the map and look for the string whose frequency is ? N / 3

Time Complexity: O(N) 
Auxiliary Space: O(N)

Efficient Approach: 
The idea is based on Moore's Voting algorithm
Find two candidates and check if any of these two candidates is actually a majority element or not.

Below is the implementation of the above approach:  

C++
// C++ program to find an
// element with frequency
// of at least N / 3
// in a linked list

#include <bits/stdc++.h>
using namespace std;

// Structure of a node
// for the linked list
struct node {
    string i;
    node* next = NULL;
};

// Utility function to
// create a node
struct node* newnode(string s)
{
    struct node* temp = (struct node*)
        malloc(sizeof(struct node));
    temp->i = s;
    temp->next = NULL;
    return temp;
}

// Function to find and return
// the element with frequency
// of at least N/3
string Majority_in_linklist(node* head)
{
    // Candidates for
    // being the required
    // majority element
    string s = "", t = "";

    // Store the frequencies
    // of the respective candidates
    int p = 0, q = 0;
    node* ptr = NULL;

    // Iterate all nodes
    while (head != NULL) {
        if (s.compare(head->i) == 0) {
            // Increase frequency
            // of candidate s
            p = p + 1;
        }
        else {
            if (t.compare(head->i) == 0) {
                // Increase frequency
                // of candidate t
                q = q + 1;
            }
            else {
                if (p == 0) {
                    // Set the new string as
                    // candidate for majority
                    s = head->i;
                    p = 1;
                }
                else {
                    if (q == 0) {
                        // Set the new string as
                        // second candidate
                        // for majority
                        t = head->i;
                        q = 1;
                    }
                    else {
                        // Decrease the frequency
                        p = p - 1;
                        q = q - 1;
                    }
                }
            }
        }
        head = head->next;
    }
    head = ptr;
    p = 0;
    q = 0;

    // Check the frequency of two
    // final selected candidate linklist
    while (head != NULL) {
        if (s.compare(head->i) == 0) {
            // Increase the frequency
            // of first candidate
            p = 1;
        }
        else {
            if (t.compare(head->i) == 0) {
                // Increase the frequency
                // of second candidate
                q = 1;
            }
        }
        head = head->next;
    }
    // Return the string with
    // higher frequency
    if (p > q) {
        return s;
    }
    else {
        return t;
    }
}
// Driver Code
int main()
{
    node* ptr = NULL;
    node* head = newnode("geeks");
    head->next = newnode("geeks");
    head->next->next = newnode("abcd");
    head->next->next->next
        = newnode("game");
    head->next->next->next->next
        = newnode("game");
    head->next->next->next->next->next
        = newnode("knight");
    head->next->next->next->next->next->next
        = newnode("harry");
    head->next->next->next->next->next->next
        ->next
        = newnode("geeks");

    cout << Majority_in_linklist(head) << endl;

    return 0;
}
Java
// Java program to find an 
// element with frequency 
// of at least N / 3 
// in a linked list 
class GFG{

// Structure of a node 
// for the linked list 
static class node
{ 
    String i; 
    node next = null; 
}; 

// Utility function to 
// create a node 
static node newnode(String s) 
{ 
    node temp = new node(); 
    temp.i = s; 
    temp.next = null; 
    return temp; 
} 

// Function to find and return 
// the element with frequency 
// of at least N/3 
static String Majority_in_linklist(node head) 
{ 
    
    // Candidates for 
    // being the required 
    // majority element 
    String s = "";
    String t = ""; 
    
    // Store the frequencies 
    // of the respective candidates 
    int p = 0, q = 0; 
    node ptr = null; 

    // Iterate all nodes 
    while (head != null)
    {
        if (s.equals(head.i))
        {
            
            // Increase frequency 
            // of candidate s 
            p = p + 1; 
        } 
        else
        { 
            if (t.equals(head.i))
            {
                
                // Increase frequency 
                // of candidate t 
                q = q + 1; 
            } 
            else 
            { 
                if (p == 0) 
                {
                    
                    // Set the new string as 
                    // candidate for majority 
                    s = head.i; 
                    p = 1; 
                } 
                else 
                { 
                    if (q == 0)
                    {
                        
                        // Set the new string as 
                        // second candidate 
                        // for majority 
                        t = head.i; 
                        q = 1; 
                    } 
                    else 
                    {
                        
                        // Decrease the frequency 
                        p = p - 1; 
                        q = q - 1; 
                    } 
                } 
            } 
        } 
        head = head.next; 
    } 
    head = ptr; 
    p = 0; 
    q = 0; 

    // Check the frequency of two 
    // final selected candidate linklist 
    while (head != null) 
    { 
        if (s.equals(head.i)) 
        {
            
            // Increase the frequency 
            // of first candidate 
            p = 1; 
        } 
        else 
        { 
            if (t.equals(head.i))
            {
                
                // Increase the frequency 
                // of second candidate 
                q = 1; 
            } 
        } 
        head = head.next; 
    } 
    
    // Return the String with 
    // higher frequency 
    if (p > q) 
    { 
        return s; 
    } 
    else 
    { 
        return t; 
    } 
} 

// Driver Code 
public static void main(String []arg)
{ 
    node ptr = null; 
    node head = newnode("geeks"); 
    head.next = newnode("geeks"); 
    head.next.next = newnode("abcd"); 
    head.next.next.next = newnode("game"); 
    head.next.next.next.next = newnode("game"); 
    head.next.next.next.next.next = newnode("knight"); 
    head.next.next.next.next.next.next = newnode("harry"); 
    head.next.next.next.next.next.next.next = newnode("geeks"); 

    System.out.println(Majority_in_linklist(head)); 
} 
}

// This code is contributed by rutvik_56
Python3
# Python3 program to find an element
# with frequency of at least N / 3 
# in a linked list 

# Structure of a node 
# for the linked list
class Node:
    def __init__(self, s):
        
        self.i = s
        self.next = None
        
# Function to find and return 
# the element with frequency 
# of at least N/3 
def Majority_in_linklist(head):
    
    # Candidates for 
    # being the required 
    # majority element 
    s, t = "", ""
    
    # Store the frequencies 
    # of the respective candidates 
    p, q = 0, 0
    ptr = None
    
    # Iterate all nodes
    while head != None:
        if s == head.i:
            
            # Increase frequency 
            # of candidate s 
            p = p + 1
        else:
            if t == head.i:
                
                # Increase frequency 
                # of candidate t 
                q = q + 1
            else:
                if p == 0:
                    
                    # Set the new string as 
                    # candidate for majority 
                    s = head.i
                    p = 1
                else:
                    if q == 0:
                        
                        # Set the new string as 
                        # second candidate 
                        # for majority
                        t = head.i
                        q = 1
                    else:
                        
                        # Decrease the frequency 
                        p = p - 1
                        q = q - 1
                        
        head = head.next
        
    head = ptr
    p = 0
    q = 0
    
    # Check the frequency of two 
    # final selected candidate linklist 
    while head != None:
        if s == head.i:
            
            # Increase the frequency 
            # of first candidate 
            p = 1
        else:
            if t == head.i:
                
                # Increase the frequency 
                # of second candidate 
                q = 1
                
        head = head.next
    
    # Return the string with 
    # higher frequency 
    if p > q:
        return s
    else:
        return t

# Driver code
ptr = None
head = Node("geeks") 
head.next = Node("geeks") 
head.next.next = Node("abcd") 
head.next.next.next = Node("game") 
head.next.next.next.next = Node("game") 
head.next.next.next.next.next = Node("knight") 
head.next.next.next.next.next.next = Node("harry") 
head.next.next.next.next.next.next.next = Node("geeks") 

print(Majority_in_linklist(head))

# This code is contributed by stutipathak31jan
C#
// C# program to find an element with
// frequency of at least N / 3 in a
// linked list 
using System;
using System.Collections;
using System.Collections.Generic;

class GFG{
 
// Structure of a node 
// for the linked list 
class node
{
    public string i; 
    public node next = null; 
}; 
 
// Utility function to 
// create a node 
static node newnode(string s) 
{ 
    node temp = new node(); 
    temp.i = s; 
    temp.next = null; 
    return temp; 
} 
 
// Function to find and return 
// the element with frequency 
// of at least N/3 
static string Majority_in_linklist(node head) 
{ 
    
    // Candidates for 
    // being the required 
    // majority element 
    string s = "";
    string t = ""; 
     
    // Store the frequencies 
    // of the respective candidates 
    int p = 0, q = 0; 
    node ptr = null; 
 
    // Iterate all nodes 
    while (head != null)
    {
        if (s.Equals(head.i))
        {
             
            // Increase frequency 
            // of candidate s 
            p = p + 1; 
        } 
        else
        { 
            if (t.Equals(head.i))
            {
                 
                // Increase frequency 
                // of candidate t 
                q = q + 1; 
            } 
            else
            { 
                if (p == 0) 
                {
                     
                    // Set the new string as 
                    // candidate for majority 
                    s = head.i; 
                    p = 1; 
                } 
                else
                { 
                    if (q == 0)
                    {
                         
                        // Set the new string as 
                        // second candidate 
                        // for majority 
                        t = head.i; 
                        q = 1; 
                    } 
                    else
                    {
                         
                        // Decrease the frequency 
                        p = p - 1; 
                        q = q - 1; 
                    } 
                } 
            } 
        } 
        head = head.next; 
    } 
    head = ptr; 
    p = 0; 
    q = 0; 
 
    // Check the frequency of two 
    // final selected candidate linklist 
    while (head != null) 
    { 
        if (s.Equals(head.i)) 
        {
             
            // Increase the frequency 
            // of first candidate 
            p = 1; 
        } 
        else
        { 
            if (t.Equals(head.i))
            {
                 
                // Increase the frequency 
                // of second candidate 
                q = 1; 
            } 
        } 
        head = head.next; 
    } 
     
    // Return the string with 
    // higher frequency 
    if (p > q) 
    { 
        return s; 
    } 
    else
    { 
        return t; 
    } 
} 
 
// Driver Code 
public static void Main(string []arg)
{ 
    node head = newnode("geeks"); 
    head.next = newnode("geeks"); 
    head.next.next = newnode("abcd"); 
    head.next.next.next = newnode("game"); 
    head.next.next.next.next = newnode("game"); 
    head.next.next.next.next.next = newnode("knight"); 
    head.next.next.next.next.next.next = newnode("harry"); 
    head.next.next.next.next.next.next.next = newnode("geeks"); 
 
    Console.Write(Majority_in_linklist(head)); 
} 
}

// This code is contributed by pratham76
JavaScript
<script>
      // JavaScript program to find an element with
      // frequency of at least N / 3 in a
      // linked list
      // Structure of a node
      // for the linked list
      class node {
        constructor() {
          this.i = "";
          this.next = null;
        }
      }

      // Utility function to
      // create a node
      function newnode(s) {
        var temp = new node();
        temp.i = s;
        temp.next = null;
        return temp;
      }

      // Function to find and return
      // the element with frequency
      // of at least N/3
      function Majority_in_linklist(head) {
        // Candidates for
        // being the required
        // majority element
        var s = "";
        var t = "";

        // Store the frequencies
        // of the respective candidates
        var p = 0,
          q = 0;
        var ptr = null;

        // Iterate all nodes
        while (head != null) {
          if (s == head.i) {
            // Increase frequency
            // of candidate s
            p = p + 1;
          } else {
            if (t == head.i) {
              // Increase frequency
              // of candidate t
              q = q + 1;
            } else {
              if (p == 0) {
                // Set the new string as
                // candidate for majority
                s = head.i;
                p = 1;
              } else {
                if (q == 0) {
                  // Set the new string as
                  // second candidate
                  // for majority
                  t = head.i;
                  q = 1;
                } else {
                  // Decrease the frequency
                  p = p - 1;
                  q = q - 1;
                }
              }
            }
          }
          head = head.next;
        }
        head = ptr;
        p = 0;
        q = 0;

        // Check the frequency of two
        // final selected candidate linklist
        while (head != null) {
          if (s == head.i) {
            // Increase the frequency
            // of first candidate
            p = 1;
          } else {
            if (t == head.i) {
              // Increase the frequency
              // of second candidate
              q = 1;
            }
          }
          head = head.next;
        }

        // Return the string with
        // higher frequency
        if (p > q) {
          return s;
        } else {
          return t;
        }
      }

      // Driver Code
      var head = newnode("geeks");
      head.next = newnode("geeks");
      head.next.next = newnode("abcd");
      head.next.next.next = newnode("game");
      head.next.next.next.next = newnode("game");
      head.next.next.next.next.next = newnode("knight");
      head.next.next.next.next.next.next = newnode("harry");
      head.next.next.next.next.next.next.next = newnode("geeks");

      document.write(Majority_in_linklist(head));
      
      // This code is contributed by rdtank.
    </script>

Output: 
geeks

 

Time Complexity: O(N) 
Auxiliary Space: O(1)
 


Similar Reads