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++ 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 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 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# 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
<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)