Find a triplet from three linked lists with sum equal to a given number
Last Updated :
28 Feb, 2023
Given three linked lists, say a, b and c, find one node from each list such that the sum of the values of the nodes is equal to a given number.
For example, if the three linked lists are 12->6->29, 23->5->8, and 90->20->59, and the given number is 101, the output should be triple “6 5 90”.
In the following solutions, size of all three linked lists is assumed same for simplicity of analysis. The following solutions work for linked lists of different sizes also.
A simple method to solve this problem is to run three nested loops. The outermost loop picks an element from list a, the middle loop picks an element from b and the innermost loop picks from c. The innermost loop also checks whether the sum of values of current nodes of a, b and c is equal to given number. The time complexity of this method will be O(n^3).
Sorting can be used to reduce the time complexity to O(n*n). Following are the detailed steps.
1) Sort list b in ascending order, and list c in descending order.
2) After the b and c are sorted, one by one pick an element from list a and find the pair by traversing both b and c. See isSumSorted() in the following code. The idea is similar to Quadratic algorithm of 3 sum problem.
Following code implements step 2 only. The solution can be easily modified for unsorted lists by adding the merge sort code discussed here.
C++
#include <bits/stdc++.h>
using namespace std;
class Node
{
public :
int data;
Node* next;
};
void 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;
}
bool isSumSorted(Node *headA, Node *headB,
Node *headC, int givenNumber)
{
Node *a = headA;
while (a != NULL)
{
Node *b = headB;
Node *c = headC;
while (b != NULL && c != NULL)
{
int sum = a->data + b->data + c->data;
if (sum == givenNumber)
{
cout << "Triplet Found: " << a->data << " " <<
b->data << " " << c->data;
return true ;
}
else if (sum < givenNumber)
b = b->next;
else
c = c->next;
}
a = a->next;
}
cout << "No such triplet" ;
return false ;
}
int main()
{
Node* headA = NULL;
Node* headB = NULL;
Node* headC = NULL;
push (&headA, 20);
push (&headA, 4);
push (&headA, 15);
push (&headA, 10);
push (&headB, 10);
push (&headB, 9);
push (&headB, 4);
push (&headB, 2);
push (&headC, 1);
push (&headC, 2);
push (&headC, 4);
push (&headC, 8);
int givenNumber = 25;
isSumSorted (headA, headB, headC, givenNumber);
return 0;
}
|
C
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
struct Node
{
int data;
struct Node* next;
};
void 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;
}
bool isSumSorted( struct Node *headA, struct Node *headB,
struct Node *headC, int givenNumber)
{
struct Node *a = headA;
while (a != NULL)
{
struct Node *b = headB;
struct Node *c = headC;
while (b != NULL && c != NULL)
{
int sum = a->data + b->data + c->data;
if (sum == givenNumber)
{
printf ( "Triplet Found: %d %d %d " , a->data,
b->data, c->data);
return true ;
}
else if (sum < givenNumber)
b = b->next;
else
c = c->next;
}
a = a->next;
}
printf ( "No such triplet" );
return false ;
}
int main()
{
struct Node* headA = NULL;
struct Node* headB = NULL;
struct Node* headC = NULL;
push (&headA, 20);
push (&headA, 4);
push (&headA, 15);
push (&headA, 10);
push (&headB, 10);
push (&headB, 9);
push (&headB, 4);
push (&headB, 2);
push (&headC, 1);
push (&headC, 2);
push (&headC, 4);
push (&headC, 8);
int givenNumber = 25;
isSumSorted (headA, headB, headC, givenNumber);
return 0;
}
|
Java
class LinkedList
{
Node head;
class Node
{
int data;
Node next;
Node( int d) {data = d; next = null ; }
}
boolean isSumSorted(LinkedList la, LinkedList lb, LinkedList lc,
int givenNumber)
{
Node a = la.head;
while (a != null )
{
Node b = lb.head;
Node c = lc.head;
while (b != null && c!= null )
{
int sum = a.data + b.data + c.data;
if (sum == givenNumber)
{
System.out.println( "Triplet found " + a.data +
" " + b.data + " " + c.data);
return true ;
}
else if (sum < givenNumber)
b = b.next;
else
c = c.next;
}
a = a.next;
}
System.out.println( "No Triplet found" );
return false ;
}
void push( int new_data)
{
Node new_node = new Node(new_data);
new_node.next = head;
head = new_node;
}
public static void main(String args[])
{
LinkedList llist1 = new LinkedList();
LinkedList llist2 = new LinkedList();
LinkedList llist3 = new LinkedList();
llist1.push( 20 );
llist1.push( 5 );
llist1.push( 15 );
llist1.push( 100 );
llist2.push( 10 );
llist2.push( 9 );
llist2.push( 4 );
llist2.push( 2 );
llist3.push( 1 );
llist3.push( 2 );
llist3.push( 4 );
llist3.push( 8 );
int givenNumber = 25 ;
llist1.isSumSorted(llist1,llist2,llist3,givenNumber);
}
}
|
Python
class Node:
def __init__( self , new_data):
self .data = new_data
self . next = None
def push ( head_ref, new_data) :
new_node = Node( 0 )
new_node.data = new_data
new_node. next = (head_ref)
(head_ref) = new_node
return head_ref;
def isSumSorted(headA, headB,headC, givenNumber) :
a = headA
while (a ! = None ) :
b = headB
c = headC
while (b ! = None and c ! = None ) :
sum = a.data + b.data + c.data
if ( sum = = givenNumber) :
print "Triplet Found: " , a.data , " " , b.data , " " , c.data,
return True
elif ( sum < givenNumber):
b = b. next
else :
c = c. next
a = a. next
print ( "No such triplet" )
return False
headA = None
headB = None
headC = None
headA = push (headA, 20 )
headA = push (headA, 4 )
headA = push (headA, 15 )
headA = push (headA, 10 )
headB = push (headB, 10 )
headB = push (headB, 9 )
headB = push (headB, 4 )
headB = push (headB, 2 )
headC = push (headC, 1 )
headC = push (headC, 2 )
headC = push (headC, 4 )
headC = push (headC, 8 )
givenNumber = 25
isSumSorted (headA, headB, headC, givenNumber)
|
C#
using System;
public class LinkedList
{
public Node head;
public class Node
{
public int data;
public Node next;
public Node( int d)
{
data = d; next = null ;
}
}
bool isSumSorted(LinkedList la, LinkedList lb,
LinkedList lc, int givenNumber)
{
Node a = la.head;
while (a != null )
{
Node b = lb.head;
Node c = lc.head;
while (b != null && c!= null )
{
int sum = a.data + b.data + c.data;
if (sum == givenNumber)
{
Console.WriteLine( "Triplet found " + a.data +
" " + b.data + " " + c.data);
return true ;
}
else if (sum < givenNumber)
b = b.next;
else
c = c.next;
}
a = a.next;
}
Console.WriteLine( "No Triplet found" );
return false ;
}
void push( int new_data)
{
Node new_node = new Node(new_data);
new_node.next = head;
head = new_node;
}
public static void Main(String []args)
{
LinkedList llist1 = new LinkedList();
LinkedList llist2 = new LinkedList();
LinkedList llist3 = new LinkedList();
llist1.push(20);
llist1.push(5);
llist1.push(15);
llist1.push(100);
llist2.push(10);
llist2.push(9);
llist2.push(4);
llist2.push(2);
llist3.push(1);
llist3.push(2);
llist3.push(4);
llist3.push(8);
int givenNumber = 25;
llist1.isSumSorted(llist1,llist2,llist3,givenNumber);
}
}
|
Javascript
<script>
class Node
{
constructor(d)
{
this .data = d;
this .next = null ;
}
}
function isSumSorted(la,lb,lc,givenNumber)
{
let a = la;
while (a != null )
{
let b = lb;
let c = lc;
while (b != null && c!= null )
{
let sum = a.data + b.data + c.data;
if (sum == givenNumber)
{
document.write( "Triplet found " + a.data +
" " + b.data + " " + c.data+ "<br>" );
return true ;
}
else if (sum < givenNumber)
b = b.next;
else
c = c.next;
}
a = a.next;
}
document.write( "No Triplet found<br>" );
return false ;
}
function push(head_ref,new_data)
{
let new_node = new Node(new_data);
new_node.next = (head_ref);
(head_ref) = new_node;
return head_ref;
}
let headA = null ;
headA = push (headA, 20)
headA = push (headA, 4)
headA = push (headA, 15)
headA = push (headA, 10)
let headB = null ;
headB = push (headB, 10)
headB = push (headB, 9)
headB = push (headB, 4)
headB = push (headB, 2)
let headC = null ;
headC = push (headC, 1)
headC = push (headC, 2)
headC = push (headC, 4)
headC = push (headC, 8)
let givenNumber = 25
isSumSorted (headA, headB, headC, givenNumber)
</script>
|
Output:
Triplet Found: 15 2 8
Time complexity: O(n2)
The linked lists b and c can be sorted in O(nLogn) time using Merge Sort (See this). The step 2 takes O(n*n) time. So the overall time complexity is O(nlogn) + O(nlogn) + O(n*n) = O(n*n).
In this approach, the linked lists b and c are sorted first, so their original order will be lost. If we want to retain the original order of b and c, we can create copy of b and c.
Auxiliary Space: O(1)
Here constant extra space is used, but if we wish to maintain the original order of lists b and c our time complexity will become O(n) as extra space will be used to store the sorted list elements.
This article is compiled by Abhinav Priyadarshi and reviewed by GeeksforGeeks team.
Similar Reads
Javascript Program For Finding A Triplet From Three Linked Lists With Sum Equal To A Given Number
Given three linked lists, say a, b and c, find one node from each list such that the sum of the values of the nodes is equal to a given number. For example, if the three linked lists are 12->6->29, 23->5->8, and 90->20->59, and the given number is 101, the output should be triple "
4 min read
Count pairs from two linked lists whose sum is equal to a given value
Given two linked lists(can be sorted or unsorted) of size n1 and n2 of distinct elements. Given a value x. The problem is to count all pairs from both lists whose sum is equal to the given value x. Note: The pair has an element from each linked list. Examples: Input : list1 = 3->1->5->7 lis
15+ min read
Find all triplets that sum to a given value or less
Given an array, arr[] and integer X. Find all the possible triplets from an arr[] whose sum is either equal to less than X. Example: Input : arr[] = {-1, 1, 3, 2}, X = 3Output: (-1, 1, 3), (-1, 1, 2)Explanation: If checked manually, the above two are the only triplets from possible 4 triplets whose
7 min read
Find a triplet (X, Y, Z) with given sum as N and GCD of two numbers is the third number
Given a positive integer N, the task is to find a triple of three distinct positive integers (X, Y, Z) such that X + Y + Z = N and X = GCD (Y, Z). Example: Input: N = 12Output:1 2 9Explanation: The triplet (1, 2, 9) is set of distinct integers such that 1 + 2 + 9 = 12 and 1 = GCD(2, 9). Input: N = 5
8 min read
Print all triplets with sum S in given sorted Linked List
Given a sorted singly linked list as list of N distinct nodes (no two nodes have the same data) and an integer S. The task is to find all distinct triplets in the list that sum up to given integer S. Examples: Input: list = 1->2->4->5->6->8->9, S = 15Output: [(1, 5, 9), (1, 6, 8),
15+ min read
Find triplet sum closest to X in a sorted Doubly Linked List (DLL)
Given a sorted doubly linked list of N nodes and an integer X, the task is to find the sum of three nodes in the list which is closest to X. Examples: Input: DLL: -8 ? 2 ? 3 ? 4 ? 5, X = 1Output: 1Explanation: The required three integers {-8, 4, 5} whose sum is 1 and is closest to 1. Input: DLL: 1 ?
11 min read
Find quadruplets with given sum in a Doubly Linked List
Given a sorted doubly linked list and an integer X, the task is to print all the quadruplets in the doubly linked list whose sum is X. Examples: Input: LL: -3 ? 1 ? 2 ? 3 ? 5 ? 6, X = 7Output:-3 2 3 5 -3 3 1 6Explanation: The quadruplets having sum 7( = X) are: {-3, 2, 3, 5}, {-3, 3, 1, 6}. Input: L
14 min read
Count triplets from a given range having sum of two numbers of a triplet equal to the third number
Given two integers L and R, the task is to find the number of unique triplets whose values lie in the range [L, R], such that the sum of any two numbers is equal to the third number. Examples: Input: L = 1, R = 3Output: 3Explanation: Three such triplets satisfying the necessary conditions are (1, 1,
9 min read
Print triplet with sum equal to N and LCM at most N/2
Given a positive integer N, the task is to find a triplet {X, Y, Z} such that the least common multiple of X, Y, and Z is less than or equal to N/2 and the sum of X, Y, and Z is equal to N. If there exist multiple answers, then print any of them. Examples: Input: N = 8Output: 4 2 2Explanation: One p
7 min read
Find pairs with given product in a sorted Doubly Linked List
Given a sorted doubly linked list of positive distinct elements, the task is to find pairs in the doubly linked list whose product is equal to given value x, without using any extra space. Examples: Input : List = 1 <=> 2 <=> 4 <=> 5 <=> 6 <=> 8 <=> 9 x = 8 Output
10 min read