Add 1 to a number represented as linked list (original) (raw)
Last Updated : 3 Apr, 2026
A **number is represented in **linked list such that each digit corresponds to a node in linked list. The task is to **add 1 to it.
**Examples:
**Input: head:4 -> 5 -> 6
**Output: head:4 -> 5 -> 7
**Explanation: Adding 1 to number represented by Linked List = 456 + 1 = 457
Input: head: 2 -> 1 -> 6 -> 9
Output: head:** 2 -> 1 -> 7 -> 0
**Explanation: Adding 1 to number represented by Linked List = 2169 + 1 = 2170
Table of Content
Recursive - O(n) Time and O(n) Space:
- **Recursively traverse the linked list, reaching the **last node first. This ensures that the **least significant digit is processed before others.
- Add 1 to the value of the last node and compute any **carry resulting from this **addition.
- While backtracking, update each node's value based on the carry propagated from the subsequent node.
- After traversing, if the **carry is not equals to 0, create new node with the data as carry andinsert it at head. C++ `
// C++ program to add one to a linked list
#include using namespace std;
class Node { public: int data; Node *next;
Node(int x) {
data = x;
next = nullptr;
}};
// Recursively add 1 from end to beginning and return // carry after all nodes are processed. int addWithCarry(Node *head) {
// If linked list is empty, return carry
if (head == nullptr) {
return 1;
}
// Add carry returned by the next node call
int res = head->data + addWithCarry(head->next);
// Update data and return new carry
head->data = res % 10;
return res / 10;}
Node *addOne(Node *head) {
// Add 1 to linked list from end to beginning
int carry = addWithCarry(head);
// If there is carry after updating all nodes,
// then we need to add a new node to the linked list
if (carry) {
Node *newNode = new Node(carry);
newNode->next = head;
// New node becomes head now
return newNode;
}
return head;}
void printList(Node *head) { Node *curr = head; while (curr != nullptr) { cout << curr->data << " "; curr = curr->next; } cout << endl; }
int main() {
// Create a hard-coded linked list:
// 1 -> 9 -> 9 -> 9
Node *head = new Node(1);
head->next = new Node(9);
head->next->next = new Node(9);
head->next->next->next = new Node(9);
head = addOne(head);
printList(head);
return 0;}
C
// C program to add one to a linked list
#include <stdio.h> #include <stdlib.h>
struct Node { int data; struct Node* next; };
struct Node* createNode(int data);
// Recursively add 1 from end to beginning and return // carry after all nodes are processed. int addWithCarry(struct Node* head) {
// If linked list is empty, return carry
if (head == NULL) {
return 1;
}
// Add carry returned by the next node call
int res = head->data + addWithCarry(head->next);
// Update data and return new carry
head->data = res % 10;
return res / 10;}
struct Node* addOne(struct Node* head) {
// Add 1 to linked list from end to beginning
int carry = addWithCarry(head);
// If there is carry after updating all nodes,
// then we need to add a new node to the linked list
if (carry) {
struct Node* newNode = createNode(carry);
newNode->next = head;
// New node becomes head now
return newNode;
}
return head;}
void printList(struct Node* head) { struct Node* curr = head; while (curr != NULL) { printf("%d ", curr->data); curr = curr->next; } printf("\n"); }
struct Node* createNode(int data) { struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); newNode->data = data; newNode->next = NULL; return newNode; }
int main() {
// Create a hard-coded linked list:
// 1 -> 9 -> 9 -> 9
struct Node* head = createNode(1);
head->next = createNode(9);
head->next->next = createNode(9);
head->next->next->next = createNode(9);
head = addOne(head);
printList(head);
return 0;}
Java
// Java program to add one to a linked list
class Node { int data; Node next;
Node(int data) {
this.data = data;
this.next = null;
}}
// Recursively add 1 from end to beginning and return // carry after all nodes are processed. class GfG {
static int addWithCarry(Node head) {
// If linked list is empty, return carry
if (head == null) {
return 1;
}
// Add carry returned by the next node call
int res = head.data + addWithCarry(head.next);
// Update data and return new carry
head.data = res % 10;
return res / 10;
}
static Node addOne(Node head) {
// Add 1 to linked list from end to beginning
int carry = addWithCarry(head);
// If there is carry after updating all nodes,
// then we need to add a new node to the linked list
if (carry > 0) {
Node newNode = new Node(carry);
newNode.next = head;
// New node becomes head now
return newNode;
}
return head;
}
static void printList(Node head) {
Node curr = head;
while (curr != null) {
System.out.print(curr.data + " ");
curr = curr.next;
}
System.out.println();
}
public static void main(String[] args) {
// Create a hard-coded linked list:
// 1 -> 9 -> 9 -> 9
Node head = new Node(1);
head.next = new Node(9);
head.next.next = new Node(9);
head.next.next.next = new Node(9);
head = addOne(head);
printList(head);
}}
Python
Python program to add one to a linked list
class Node: def init(self, data): self.data = data self.next = None
Recursively add 1 from end to beginning and return
carry after all nodes are processed.
def addWithCarry(head):
# If linked list is empty, return carry
if head is None:
return 1
# Add carry returned by the next node call
res = head.data + addWithCarry(head.next)
# Update data and return new carry
head.data = res % 10
return res // 10def addOne(head):
# Add 1 to linked list from end to beginning
carry = addWithCarry(head)
# If there is carry after updating all nodes,
# then we need to add a new node to the linked list
if carry:
newNode = Node(carry)
newNode.next = head
# New node becomes head now
return newNode
return headdef printList(head): curr = head while curr: print(curr.data, end=" ") curr = curr.next print()
if name == "main":
# Create a hard-coded linked list:
# 1 -> 9 -> 9 -> 9
head = Node(1)
head.next = Node(9)
head.next.next = Node(9)
head.next.next.next = Node(9)
head = addOne(head)
printList(head)C#
// C# program to add 1 to a linked list
using System;
class Node { public int data; public Node next;
public Node(int data) {
this.data = data;
this.next = null;
}}
class GfG {
// Recursively add 1 from end to beginning and return
// carry after all nodes are processed.
static int addWithCarry(Node head) {
// If linked list is empty, return carry
if (head == null) {
return 1;
}
// Add carry returned by the next node call
int res = head.data + addWithCarry(head.next);
// Update data and return new carry
head.data = res % 10;
return res / 10;
}
static Node addOne(Node head) {
// Add 1 to linked list from end to beginning
int carry = addWithCarry(head);
// If there is carry after updating all nodes,
// then we need to add a new node to the linked list
if (carry > 0) {
Node newNode = new Node(carry);
newNode.next = head;
// New node becomes head now
return newNode;
}
return head;
}
static void printList(Node head) {
Node curr = head;
while (curr != null) {
Console.Write(curr.data + " ");
curr = curr.next;
}
Console.WriteLine();
}
static void Main() {
// Create a hard-coded linked list:
// 1 -> 9 -> 9 -> 9
Node head = new Node(1);
head.next = new Node(9);
head.next.next = new Node(9);
head.next.next.next = new Node(9);
head = addOne(head);
printList(head);
}}
JavaScript
// Javascript program to add one to a linked list
class Node { constructor(data) { this.data = data; this.next = null; } }
// Recursively add 1 from end to beginning and return // carry after all nodes are processed. function addWithCarry(head) {
// If linked list is empty, return carry
if (head === null) {
return 1;
}
// Add carry returned by the next node call
const res = head.data + addWithCarry(head.next);
// Update data and return new carry
head.data = res % 10;
return Math.floor(res / 10);}
function addOne(head) {
// Add 1 to linked list from end to beginning
const carry = addWithCarry(head);
// If there is carry after updating all nodes,
// then we need to add a new node to the linked list
if (carry > 0) {
const newNode = new Node(carry);
newNode.next = head;
// New node becomes head now
return newNode;
}
return head;}
function printList(head) { let curr = head; while (curr !== null) { console.log(curr.data + " "); curr = curr.next; } console.log(); }
// Create a hard-coded linked list: // 1 -> 9 -> 9 -> 9 let head = new Node(1); head.next = new Node(9); head.next.next = new Node(9); head.next.next.next = new Node(9);
head = addOne(head);
printList(head);
`
**Time Complexity: O(n), where n is the number of nodes in the linked list.
**Auxiliary Space: O(n)
Iterative - O(n) Time and O(1) Space:
- Reverse given linked list. For example, 1-> 9-> 9 -> 9 is converted to 9-> 9 -> 9 ->1.
- Start traversing linked list from leftmost node and add 1 to it. If there is a carry, move to the next node. Keep moving to the next node while there is a carry. This gives us 0->0->0->2
- After traversing, if the **carry is not equals to 0, create new node with the data as carry andinsert it at head. In this case, the carry is 0.
- Reverse modified linked list and return head. This gives us 2->0->0->0 C++ `
// C++ program to add one to a linked list
#include <bits/stdc++.h> using namespace std;
class Node { public: int data; Node *next;
Node(int x) {
data = x;
next = nullptr;
}};
// Function to reverse the linked list Node* reverse(Node* head) { Node *curr = head, *prev = nullptr, *next; while (curr != nullptr) { next = curr->next; curr->next = prev; prev = curr; curr = next; } return prev; }
// Function to add one to a linked list and // return the head node of the resultant list Node *addOneUtil(Node *head) { Node *res = head; Node *curr = head; Node *last = nullptr;
// Initialize carry with 1 (to add one)
int carry = 1;
int sum;
while (curr != nullptr) {
// Calculate sum of carry and current node's data
sum = carry + curr->data;
// Update carry for next digit
carry = (sum >= 10) ? 1 : 0;
// Update current node's data to sum modulo 10
curr->data = sum % 10;
// Move to the next node
last = curr;
curr = curr->next;
}
// If there's a carry left, add a
// new node with carry value
if (carry > 0) {
last->next = new Node(carry);
}
return res;}
// Main function to add one to the linked list Node *addOne(Node *head) {
// Reverse the linked list
head = reverse(head);
// Add one to the reversed list
head = addOneUtil(head);
// Reverse the list again to restore
// the original order
return reverse(head);}
void printList(Node *head) { Node *curr = head; while (curr != nullptr) { cout << curr->data << " "; curr = curr->next; } cout << endl; }
int main() {
// Create a hard-coded linked list:
// 1 -> 9 -> 9 -> 9
Node *head = new Node(1);
head->next = new Node(9);
head->next->next = new Node(9);
head->next->next->next = new Node(9);
head = addOne(head);
printList(head);
return 0;}
C
// C program to add 1 to a linked list
#include <stdio.h> #include <stdlib.h>
struct Node { int data; struct Node* next; };
struct Node* createNode(int data);
// Function to reverse the linked list struct Node* reverse(struct Node* head) { struct Node* curr = head; struct Node* prev = NULL; struct Node* next; while (curr != NULL) { next = curr->next; curr->next = prev; prev = curr; curr = next; } return prev; }
// Function to add one to a linked list and // return the head node of the resultant list struct Node* addOneUtil(struct Node* head) { struct Node* res = head; struct Node* curr = head; struct Node* last = NULL;
// Initialize carry with 1 (to add one)
int carry = 1;
int sum;
while (curr != NULL) {
// Calculate sum of carry and current node's data
sum = carry + curr->data;
// Update carry for next digit
carry = (sum >= 10) ? 1 : 0;
// Update current node's data to sum modulo 10
curr->data = sum % 10;
// Move to the next node
last = curr;
curr = curr->next;
}
// If there's a carry left, add a new
// node with carry value
if (carry > 0) {
last->next = createNode(carry);
}
return res;}
// Main function to add one to the linked list struct Node* addOne(struct Node* head) {
// Reverse the linked list
head = reverse(head);
// Add one to the reversed list
head = addOneUtil(head);
// Reverse the list again to restore
// the original order
return reverse(head);}
void printList(struct Node* head) { struct Node* curr = head; while (curr != NULL) { printf("%d ", curr->data); curr = curr->next; } printf("\n"); }
struct Node* createNode(int data) { struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); newNode->data = data; newNode->next = NULL; return newNode; }
int main() {
// Create a hard-coded linked list:
// 1 -> 9 -> 9 -> 9
struct Node* head = createNode(1);
head->next = createNode(9);
head->next->next = createNode(9);
head->next->next->next = createNode(9);
head = addOne(head);
printList(head);
return 0;}
Java
// Java program to add 1 to a linked list
class Node { int data; Node next;
Node(int x) {
this.data = x;
this.next = null;
}}
// Function to reverse the linked list class GfG { static Node reverse(Node head) { Node curr = head, prev = null, next; while (curr != null) { next = curr.next; curr.next = prev; prev = curr; curr = next; } return prev; }
// Function to add one to a linked list and
// return the head node of the resultant list
static Node addOneUtil(Node head) {
Node res = head;
Node curr = head;
Node last = null;
// Initialize carry with 1 (to add one)
int carry = 1;
int sum;
while (curr != null) {
// Calculate sum of carry
// and current node's data
sum = carry + curr.data;
// Update carry for next digit
carry = (sum >= 10) ? 1 : 0;
// Update current node's data to sum modulo 10
curr.data = sum % 10;
// Move to the next node
last = curr;
curr = curr.next;
}
// If there's a carry left, add a new
// node with carry value
if (carry > 0) {
last.next = new Node(carry);
}
return res;
}
// Main function to add one to the linked list
static Node addOne(Node head) {
// Reverse the linked list
head = reverse(head);
// Add one to the reversed list
head = addOneUtil(head);
// Reverse the list again to restore
//the original order
return reverse(head);
}
static void printList(Node head) {
Node curr = head;
while (curr != null) {
System.out.print(curr.data + " ");
curr = curr.next;
}
System.out.println();
}
public static void main(String[] args) {
// Create a hard-coded linked list:
// 1 -> 9 -> 9 -> 9
Node head = new Node(1);
head.next = new Node(9);
head.next.next = new Node(9);
head.next.next.next = new Node(9);
head = addOne(head);
printList(head);
}}
Python
Python3 program to add 1 to a linked list
class Node: def init(self, data): self.data = data self.next = None
Function to reverse the linked list
def reverse(head): curr = head prev = None while curr: next = curr.next curr.next = prev prev = curr curr = next return prev
Function to add one to a linked list and
return the head node of the resultant list
def addOneUtil(head): res = head curr = head last = None
# Initialize carry with 1 (to add one)
carry = 1
while curr:
# Calculate sum of carry and current node's data
sum = carry + curr.data
# Update carry for next digit
carry = 1 if sum >= 10 else 0
# Update current node's data to sum modulo 10
curr.data = sum % 10
# Move to the next node
last = curr
curr = curr.next
# If there's a carry left, add a new
# node with carry value
if carry > 0:
last.next = Node(carry)
return resMain function to add one to the linked list
def addOne(head):
# Reverse the linked list
head = reverse(head)
# Add one to the reversed list
head = addOneUtil(head)
# Reverse the list again to restore
# the original order
return reverse(head)def printList(head): curr = head while curr: print(curr.data, end=" ") curr = curr.next print()
if name == 'main':
# Create a hard-coded linked list:
# 1 -> 9 -> 9 -> 9
head = Node(1)
head.next = Node(9)
head.next.next = Node(9)
head.next.next.next = Node(9)
head = addOne(head)
printList(head)C#
// C# program to add 1 to a linked list
using System;
class Node { public int data; public Node next;
public Node(int x) {
this.data = x;
this.next = null;
}}
class GfG {
// Function to reverse the linked list
static Node Reverse(Node head) {
Node curr = head, prev = null, next = null;
while (curr != null) {
next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
return prev;
}
// Function to add one to a linked list and
// return the head node of the resultant list
static Node AddOneUtil(Node head) {
Node res = head;
Node curr = head;
Node last = null;
// Initialize carry with 1 (to add one)
int carry = 1;
int sum;
while (curr != null) {
// Calculate sum of carry and
// current node's data
sum = carry + curr.data;
// Update carry for next digit
carry = (sum >= 10) ? 1 : 0;
// Update current node's data to sum modulo 10
curr.data = sum % 10;
// Move to the next node
last = curr;
curr = curr.next;
}
// If there's a carry left, add a new
// node with carry value
if (carry > 0) {
last.next = new Node(carry);
}
return res;
}
// Main function to add one to the linked list
static Node AddOne(Node head) {
// Reverse the linked list
head = Reverse(head);
// Add one to the reversed list
head = AddOneUtil(head);
// Reverse the list again to restore
// the original order
return Reverse(head);
}
static void PrintList(Node head) {
Node curr = head;
while (curr != null) {
Console.Write(curr.data + " ");
curr = curr.next;
}
Console.WriteLine();
}
static void Main() {
// Create a hard-coded linked list:
// 1 -> 9 -> 9 -> 9
Node head = new Node(1);
head.next = new Node(9);
head.next.next = new Node(9);
head.next.next.next = new Node(9);
head = AddOne(head);
PrintList(head);
}}
JavaScript
// Javascript program to add 1 to a linked list
class Node { constructor(data) { this.data = data; this.next = null; } }
// Function to reverse the linked list function reverse(head) { let curr = head, prev = null, next; while (curr != null) { next = curr.next; curr.next = prev; prev = curr; curr = next; } return prev; }
// Function to add one to a linked list and // return the head node of the resultant list function addOneUtil(head) { let res = head; let curr = head; let last = null;
// Initialize carry with 1 (to add one)
let carry = 1;
let sum;
while (curr != null) {
// Calculate sum of carry and current node's data
sum = carry + curr.data;
// Update carry for next digit
carry = (sum >= 10) ? 1 : 0;
// Update current node's data to sum modulo 10
curr.data = sum % 10;
// Move to the next node
last = curr;
curr = curr.next;
}
// If there's a carry left, add a new
// node with carry value
if (carry > 0) {
last.next = new Node(carry);
}
return res;}
// Main function to add one to the linked list function addOne(head) {
// Reverse the linked list
head = reverse(head);
// Add one to the reversed list
head = addOneUtil(head);
// Reverse the list again to restore
// the original order
return reverse(head);}
function printList(head) { let curr = head; while (curr != null) { console.log(curr.data + " "); curr = curr.next; } console.log(); }
// Create a hard-coded linked list: // 1 -> 9 -> 9 -> 9 let head = new Node(1); head.next = new Node(9); head.next.next = new Node(9); head.next.next.next = new Node(9);
head = addOne(head);
printList(head);
`
**Time Complexity: O(n), where n is the number of nodes in the linked list.
**Auxiliary Space: O(1), As constant extra space is used.
