Skip to content
Related Articles
Sum of all subset sums of a linked list
• Last Updated : 29 Apr, 2020

Given a linked list, the task is to find the sum of all subsets of a linked list.

Examples:

Input: 2 -> 3 -> NULL
Output: 10
Explanation:
All non-empty subsets are {2}, {3} and {2, 3}
Total sum = 2 + 3 + (2 + 3) = 10

Input: 2 -> 1 -> 5 -> 6 -> NULL
Output: 112

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

Approach: Considering all the possible subsets, we can observe that each node appears 2(N – 1) times. Thus, the product of sum of all nodes and 2(N – 1) gives us the final answer.

Below is the implementation of the above approach:

## C++

 `// C++ implementation to find the``// sum of values of all subsets of linked list.``#include ``using` `namespace` `std;`` ` `/* A Linked list node */``struct` `Node {``    ``int` `data;``    ``struct` `Node* next;``};`` ` `// function to insert a node at the``// beginning of the linked list``void` `push(``struct` `Node** head_ref, ``int` `new_data)``{``    ``/* allocate node */``    ``struct` `Node* new_node = ``new` `Node;`` ` `    ``/* put in the data */``    ``new_node->data = new_data;`` ` `    ``/* link the old list to the new node */``    ``new_node->next = (*head_ref);`` ` `    ``/* move the head to point to the new node */``    ``(*head_ref) = new_node;``}`` ` `// function to find the``// sum of values of all subsets of linked list.``int` `sumOfNodes(``struct` `Node* head)``{``    ``struct` `Node* ptr = head;``    ``int` `sum = 0;``    ``int` `n = 0; ``// size of linked list``    ``while` `(ptr != NULL) {`` ` `        ``sum += ptr->data;``        ``ptr = ptr->next;``        ``n++;``    ``}`` ` `    ``// Every element appears 2^(n-1) times``    ``sum = sum * ``pow``(2, n - 1);``    ``return` `sum;``}`` ` `// Driver program to test above``int` `main()``{``    ``struct` `Node* head = NULL;`` ` `    ``// create linked list 2->1->5->6``    ``push(&head, 2);``    ``push(&head, 1);``    ``push(&head, 5);``    ``push(&head, 6);`` ` `    ``cout << sumOfNodes(head);``    ``return` `0;``}`

## Java

 `// Java implementation to find the``// sum of values of all subsets of linked list.`` ` `import` `java.util.*;`` ` `class` `GFG{``  ` `/* A Linked list node */``static` `class` `Node {``    ``int` `data;``    ``Node next;``};``  ` `// function to insert a node at the``// beginning of the linked list``static` `Node push(Node head_ref, ``int` `new_data)``{``    ``/* allocate node */``    ``Node new_node = ``new` `Node();``  ` `    ``/* put in the data */``    ``new_node.data = new_data;``  ` `    ``/* link the old list to the new node */``    ``new_node.next = head_ref;``  ` `    ``/* move the head to point to the new node */``    ``head_ref = new_node;``    ``return` `head_ref;``}``  ` `// function to find the``// sum of values of all subsets of linked list.``static` `int` `sumOfNodes(Node head)``{``    ``Node ptr = head;``    ``int` `sum = ``0``;``    ``int` `n = ``0``; ``// size of linked list``    ``while` `(ptr != ``null``) {``  ` `        ``sum += ptr.data;``        ``ptr = ptr.next;``        ``n++;``    ``}``  ` `    ``// Every element appears 2^(n-1) times``    ``sum = (``int``) (sum * Math.pow(``2``, n - ``1``));``    ``return` `sum;``}``  ` `// Driver program to test above``public` `static` `void` `main(String[] args)``{``    ``Node head = ``null``;``  ` `    ``// create linked list 2.1.5.6``    ``head = push(head, ``2``);``    ``head = push(head, ``1``);``    ``head = push(head, ``5``);``    ``head = push(head, ``6``);``  ` `    ``System.out.print(sumOfNodes(head));``}``}`` ` `// This code is contributed by 29AjayKumar`

## Python3

 `# Python3 implementation to find the``# sum of values of all subsets of linked list.`` ` `# A Linked list node ``class` `Node: ``    ``def` `__init__(``self``,data): ``        ``self``.data ``=` `data ``        ``self``.``next` `=` `None`` ` `# function to insert a node at the``# beginning of the linked list``def` `push(head_ref,new_data):``    ``new_node``=``Node(new_data)``    ``#new_node.data = new_data``    ``new_node.``next` `=` `head_ref``    ``head_ref ``=` `new_node``    ``return` `head_ref`` ` `# function to find the``# sum of values of all subsets of linked list.``def` `sumOfNodes(head):``    ``ptr ``=` `head``    ``sum` `=` `0``    ``n ``=` `0` `# size of linked list``    ``while` `(ptr !``=` `None``) :`` ` `        ``sum` `+``=` `ptr.data``        ``ptr ``=` `ptr.``next``        ``n ``+``=` `1``     ` `    ``# Every element appears 2^(n-1) times``    ``sum` `=` `sum` `*` `pow``(``2``, n ``-` `1``)``    ``return` `sum`` ` `# Driver program to test above``if` `__name__``=``=``'__main__'``: `` ` `    ``head ``=` `None`` ` `    ``# create linked list 2.1.5.6``    ``head ``=` `push(head, ``2``)``    ``head ``=` `push(head, ``1``)``    ``head ``=` `push(head, ``5``)``    ``head ``=` `push(head, ``6``)`` ` `    ``print``(sumOfNodes(head))``     ` `# This code is contributed by AbhiThakur`

## C#

 `// C# implementation to find the``// sum of values of all subsets of linked list.``using` `System;`` ` `class` `GFG{``   ` `/* A Linked list node */``class` `Node {``    ``public` `int` `data;``    ``public` `Node next;``};``   ` `// function to insert a node at the``// beginning of the linked list``static` `Node push(Node head_ref, ``int` `new_data)``{``    ``/* allocate node */``    ``Node new_node = ``new` `Node();``   ` `    ``/* put in the data */``    ``new_node.data = new_data;``   ` `    ``/* link the old list to the new node */``    ``new_node.next = head_ref;``   ` `    ``/* move the head to point to the new node */``    ``head_ref = new_node;``    ``return` `head_ref;``}``   ` `// function to find the``// sum of values of all subsets of linked list.``static` `int` `sumOfNodes(Node head)``{``    ``Node ptr = head;``    ``int` `sum = 0;``    ``int` `n = 0; ``// size of linked list``    ``while` `(ptr != ``null``) {``   ` `        ``sum += ptr.data;``        ``ptr = ptr.next;``        ``n++;``    ``}``   ` `    ``// Every element appears 2^(n-1) times``    ``sum = (``int``) (sum * Math.Pow(2, n - 1));``    ``return` `sum;``}``   ` `// Driver program to test above``public` `static` `void` `Main(String[] args)``{``    ``Node head = ``null``;``   ` `    ``// create linked list 2.1.5.6``    ``head = push(head, 2);``    ``head = push(head, 1);``    ``head = push(head, 5);``    ``head = push(head, 6);``   ` `    ``Console.Write(sumOfNodes(head));``}``}`` ` `// This code is contributed by Rajput-Ji`
Output:
```112
```

Time Complexity: O(N)

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with industry experts, please refer Geeks Classes Live

My Personal Notes arrow_drop_up