Find the largest and second largest value in a Linked List - GeeksforGeeks

18 Jun, 2021
Given a Linked List, the task is to find the largest and second largest value in a Linked List.Example:  
Input: LL = 10 -> 15 -> 5 -> 20 -> 7 -> 9 Output: Largest = 20 Second Largest = 15Input: LL = 0 -> 5 -> 52 -> 21 Output: Largest = 52 Second Largest = 21  
 
Approach:  
Store the maximum of first two nodes in a variable max.Store the minimum of first two nodes in a variable second_max.Iterate over the remaining linked list. For each node: If current node value is greater than max, then set second_max as max and max as current node’s value.Else if current node value is greater than second_max, then set second_max as current node’s value.
Store the maximum of first two nodes in a variable max.
Store the minimum of first two nodes in a variable second_max.
Iterate over the remaining linked list. For each node: If current node value is greater than max, then set second_max as max and max as current node’s value.Else if current node value is greater than second_max, then set second_max as current node’s value.
If current node value is greater than max, then set second_max as max and max as current node’s value.
Else if current node value is greater than second_max, then set second_max as current node’s value.
Below is the implementation of the above approach:  
C++
Java
Python3
C#
Javascript
// C++ program to find the largest and// second largest element in a Linked List #include <bits/stdc++.h>using namespace std; // Link list nodestruct Node {    int data;    struct Node* next;}; // Function to push the node at the// beginning of the linked listvoid push(struct Node** head_ref,          int new_data){    struct Node* new_node        = (struct Node*)malloc(            sizeof(struct Node));     new_node->data = new_data;    new_node->next = (*head_ref);    (*head_ref) = new_node;} // Function to print the largest// and second largest elementvoid findLargestAndSecondLargest(struct Node* head){    // initialise max and second max using    // first two nodes of linked list    int val1 = head->data,        val2 = head->next->data,        max = std::max(val1, val2),        second_max = std::min(val1, val2);     // move the head pointer to 3rd node    head = head->next->next;     // iterate over rest of linked list    while (head != NULL) {         if (head->data > max) {             // If current node value is greater            // than max, then set second_max as            // current max value and max as            // current node value            second_max = max;            max = head->data;        }        else if (head->data > second_max) {             // else if current node value is            // greater than second_max, set            // second_max as node value            second_max = head->data;        }         // move the head pointer to next node        head = head->next;    }     // Print the largest    // and second largest value    cout << "Largest = "         << max << endl;    cout << "Second Largest = "         << second_max << endl;} // Driver codeint main(){    struct Node* head = NULL;     push(&head, 20);    push(&head, 5);    push(&head, 15);    push(&head, 10);    push(&head, 7);    push(&head, 6);    push(&head, 11);    push(&head, 9);     findLargestAndSecondLargest(head);     return 0;}
// Java program to find the largest and// second largest element in a Linked Listclass GFG{  // Link list nodestatic class Node {    int data;    Node next; };  // Function to push the node at the// beginning of the linked liststatic Node push(Node head_ref,          int new_data){    Node new_node        = new Node();      new_node.data = new_data;    new_node.next = head_ref;    head_ref = new_node;    return head_ref;}  // Function to print the largest// and second largest elementstatic void findLargestAndSecondLargest(Node head){    // initialise max and second max using    // first two nodes of linked list    int val1 = head.data,        val2 = head.next.data,        max = Math.max(val1, val2),        second_max = Math.min(val1, val2);      // move the head pointer to 3rd node    head = head.next.next;      // iterate over rest of linked list    while (head != null) {          if (head.data > max) {              // If current node value is greater            // than max, then set second_max as            // current max value and max as            // current node value            second_max = max;            max = head.data;        }        else if (head.data > second_max) {              // else if current node value is            // greater than second_max, set            // second_max as node value            second_max = head.data;        }          // move the head pointer to next node        head = head.next;    }      // Print the largest    // and second largest value    System.out.print("Largest = "         + max +"\n");    System.out.print("Second Largest = "         + second_max +"\n");}  // Driver codepublic static void main(String[] args){    Node head = null;      head = push(head, 20);    head = push(head, 5);    head = push(head, 15);    head = push(head, 10);    head = push(head, 7);    head = push(head, 6);    head = push(head, 11);    head = push(head, 9);      findLargestAndSecondLargest(head);}} // This code is contributed by Rajput-Ji
# Python3 program to find the largest and# second largest element in a Linked List# Node classclass Node:         # Function to initialize the node object    def __init__(self, data):                 # Assign data        self.data = data                 # Initialize        # next as null        self.next = None     # Linked List Classclass LinkedList:     # Function to initialize the    # LinkedList class.    def __init__(self):                 # Initialize head as None        self.head = None     # This function insert a new node at the    # beginning of the linked list    def push(self, new_data):             # Create a new Node        new_node = Node(new_data)         # Make next of new Node as head        new_node.next = self.head         # Move the head to point to new Node        self.head = new_node     # Function to find the max and    # second largest value from the list    def findLargestAndSecondLargest(self):         # Take a Head to iterate list        Head = self.head         # Initialize max and second_max        # using first two nodes of the list        val1 = Head.data        val2 = Head.next.data        Max = max(val1, val2)        second_max = min(val1, val2)         # Move the Head to third node        Head = Head.next.next         # Iterate over rest of linked list        while(Head != None):             # If current node value is            # greater then Max then            if(Head.data > Max):                 # Set the current max to second_max                # and current node value to max                second_max = Max                Max = Head.data             # Else if current node value is            # greater then second_max value            elif(Head.data > second_max):                 # Then current node value                # to second_max                second_max = Head.data             # Move the head to next node            Head = Head.next         # Print the largest and second largest values        print("Largest = ", Max)        print("Second Largest = ", second_max) # Driver codeif __name__ == '__main__':     # Initialising the linked list    head = LinkedList()     # Pushing the values in list    head.push(20)    head.push(5)    head.push(15)    head.push(10)    head.push(7)    head.push(6)    head.push(11)    head.push(9)         # Calling the function to print    # largest and second largest values.    head.findLargestAndSecondLargest()             # This code is contributed by Amit Mangal.
// C# program to find the largest and// second largest element in a Linked Listusing System; class GFG{   // Link list nodeclass Node {    public int data;    public Node next;  };   // Function to push the node at the// beginning of the linked liststatic Node push(Node head_ref,          int new_data){    Node new_node        = new Node();       new_node.data = new_data;    new_node.next = head_ref;    head_ref = new_node;    return head_ref;}   // Function to print the largest// and second largest elementstatic void findLargestAndSecondLargest(Node head){    // initialise max and second max using    // first two nodes of linked list    int val1 = head.data,        val2 = head.next.data,        max = Math.Max(val1, val2),        second_max = Math.Min(val1, val2);       // move the head pointer to 3rd node    head = head.next.next;       // iterate over rest of linked list    while (head != null) {           if (head.data > max) {               // If current node value is greater            // than max, then set second_max as            // current max value and max as            // current node value            second_max = max;            max = head.data;        }        else if (head.data > second_max) {               // else if current node value is            // greater than second_max, set            // second_max as node value            second_max = head.data;        }           // move the head pointer to next node        head = head.next;    }       // Print the largest    // and second largest value    Console.Write("Largest = "         + max +"\n");    Console.Write("Second Largest = "         + second_max +"\n");}   // Driver codepublic static void Main(String[] args){    Node head = null;       head = push(head, 20);    head = push(head, 5);    head = push(head, 15);    head = push(head, 10);    head = push(head, 7);    head = push(head, 6);    head = push(head, 11);    head = push(head, 9);       findLargestAndSecondLargest(head);}} // This code is contributed by Princi Singh
<script> // Javascript program to find the largest and// second largest element in a Linked List // Link list nodeclass Node {     constructor()    {        this.data = 0;        this.next = null;    }}; // Function to push the node at the// beginning of the linked listfunction push(head_ref, new_data){    var new_node = new Node();     new_node.data = new_data;    new_node.next = (head_ref);    (head_ref) = new_node;    return head_ref;} // Function to print the largest// and second largest elementfunction findLargestAndSecondLargest(head){    // initialise max and second max using    // first two nodes of linked list    var val1 = head.data,        val2 = head.next.data,        max = Math.max(val1, val2),        second_max = Math.min(val1, val2);     // move the head pointer to 3rd node    head = head.next.next;     // iterate over rest of linked list    while (head != null) {         if (head.data > max) {             // If current node value is greater            // than max, then set second_max as            // current max value and max as            // current node value            second_max = max;            max = head.data;        }        else if (head.data > second_max) {             // else if current node value is            // greater than second_max, set            // second_max as node value            second_max = head.data;        }         // move the head pointer to next node        head = head.next;    }     // Print the largest    // and second largest value    document.write( "Largest = "         + max + "<br>");    document.write( "Second Largest = "         + second_max + "<br>");} // Driver codevar head = null;head = push(head, 20);head = push(head, 5);head = push(head, 15);head = push(head, 10);head = push(head, 7);head = push(head, 6);head = push(head, 11);head = push(head, 9);findLargestAndSecondLargest(head); // This code is contributed by noob2000.</script>
Largest = 20
Second Largest = 15
 
Performance Analysis:  
Time Complexity: In the above approach, as we are iterating over the linked list only once, so the time complexity is O(N).
Auxiliary Space Complexity: In the above approach, we are not using any extra space apart from a few constant size variables, so Auxiliary space complexity is O(1).
 
Rajput-Ji
princi singh
amit_mangal_
noob2000
Linked List
School Programming
Linked List
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
LinkedList in Java
Doubly Linked List | Set 1 (Introduction and Insertion)
Linked List vs Array
Detect loop in a linked list
Merge two sorted linked lists
Python Dictionary
Arrays in C/C++
Inheritance in C++
Reverse a string in Java
Interfaces in Java