Next Smallest Palindrome (original) (raw)
Last Updated : 10 Apr, 2026
Given a number, in the form of an array **num[] of size n containing digits from 1 to 9(inclusive). Find the next smallest palindrome strictly larger than the given number.
**Input: num[] = [9, 4, 1, 8, 7, 9, 7, 8, 3, 2, 2]
**Output: [9, 4, 1, 8, 8, 0, 8, 8, 1, 4, 9]
**Explanation: Next smallest palindrome is 9 4 1 8 8 0 8 8 1 4 9**Input: num[] = [2, 3, 5, 4, 5]
**Output: [2, 3, 6, 3, 2]
**Explanation: Next smallest palindrome is 2 3 6 3 2
Table of Content
Try All Possible Numbers
The idea is to keep adding 1 to the number and check if it becomes a palindrome. Stop when a palindrome is found.
C++ `
#include #include using namespace std;
int checkPalindrome(vector& num) { int n = num.size(); for (int i = 0; i < n / 2; ++i) { if (num[i] != num[n - 1 - i]) { return 0; } } return 1; }
vector nextPalindrome(vector& num) { int n = num.size();
while (true) {
// Add 1 to the number (always do this first)
int carry = 1;
for (int i = n - 1; i >= 0; --i) {
num[i] += carry;
if (num[i] == 10) {
num[i] = 0;
carry = 1;
} else {
carry = 0;
break;
}
}
// If carry remains, insert 1 at beginning
if (carry == 1) {
num.insert(num.begin(), 1);
n++;
}
// Check if palindrome
if (checkPalindrome(num)) {
break;
}
}
return num;}
int main() { vector num = {9, 4, 1, 8, 7, 9, 7, 8, 3, 2, 2};
vector<int> res = nextPalindrome(num);
for (int i = 0; i < res.size(); ++i) {
cout << res[i] << " ";
}
cout << endl;
return 0;}
Java
import java.util.*;
class GfG {
static int checkPalindrome(int[] num) {
int n = num.length;
for (int i = 0; i < n / 2; ++i) {
if (num[i] != num[n - 1 - i]) {
return 0;
}
}
return 1;
}
static int[] nextPalindrome(int[] num) {
int n = num.length;
while (true) {
// Add 1 to the number (always do this first)
int carry = 1;
for (int i = n - 1; i >= 0; --i) {
num[i] += carry;
if (num[i] == 10) {
num[i] = 0;
carry = 1;
} else {
carry = 0;
break;
}
}
// If carry remains, insert 1 at beginning
if (carry == 1) {
int[] newNum = new int[n + 1];
newNum[0] = 1;
for (int i = 0; i < n; i++) {
newNum[i + 1] = num[i];
}
num = newNum;
n++;
}
// Check if palindrome
if (checkPalindrome(num) == 1) {
break;
}
}
return num;
}
public static void main(String[] args) {
int[] num = {9, 4, 1, 8, 7, 9, 7, 8, 3, 2, 2};
int[] res = nextPalindrome(num);
for (int i = 0; i < res.length; ++i) {
System.out.print(res[i] + " ");
}
}}
Python
def checkPalindrome(num): n = len(num) for i in range(n // 2): if num[i] != num[n - 1 - i]: return 0 return 1
def nextPalindrome(num): n = len(num)
while True:
# Add 1 to the number (always do this first)
carry = 1
for i in range(n - 1, -1, -1):
num[i] += carry
if num[i] == 10:
num[i] = 0
carry = 1
else:
carry = 0
break
# If carry remains, insert 1 at beginning
if carry == 1:
num.insert(0, 1)
n += 1
# Check if palindrome
if checkPalindrome(num):
break
return numif name == "main": num = [9, 4, 1, 8, 7, 9, 7, 8, 3, 2, 2]
res = nextPalindrome(num)
for i in range(len(res)):
print(res[i], end=" ")C#
using System;
class GfG {
static int checkPalindrome(int[] num) {
int n = num.Length;
for (int i = 0; i < n / 2; ++i) {
if (num[i] != num[n - 1 - i]) {
return 0;
}
}
return 1;
}
static int[] nextPalindrome(int[] num) {
int n = num.Length;
while (true) {
// Add 1 to the number (always do this first)
int carry = 1;
for (int i = n - 1; i >= 0; --i) {
num[i] += carry;
if (num[i] == 10) {
num[i] = 0;
carry = 1;
} else {
carry = 0;
break;
}
}
// If carry remains, insert 1 at beginning
if (carry == 1) {
int[] newNum = new int[n + 1];
newNum[0] = 1;
for (int i = 0; i < n; i++) {
newNum[i + 1] = num[i];
}
num = newNum;
n++;
}
// Check if palindrome
if (checkPalindrome(num) == 1) {
break;
}
}
return num;
}
static void Main() {
int[] num = {9, 4, 1, 8, 7, 9, 7, 8, 3, 2, 2};
int[] res = nextPalindrome(num);
for (int i = 0; i < res.Length; ++i) {
Console.Write(res[i] + " ");
}
}}
JavaScript
function checkPalindrome(num) { let n = num.length; for (let i = 0; i < Math.floor(n / 2); ++i) { if (num[i] !== num[n - 1 - i]) { return 0; } } return 1; }
function nextPalindrome(num) { let n = num.length;
while (true) {
// Add 1 to the number (always do this first)
let carry = 1;
for (let i = n - 1; i >= 0; --i) {
num[i] += carry;
if (num[i] === 10) {
num[i] = 0;
carry = 1;
} else {
carry = 0;
break;
}
}
// If carry remains, insert 1 at beginning
if (carry === 1) {
num.unshift(1);
n++;
}
// Check if palindrome
if (checkPalindrome(num)) {
break;
}
}
return num;}
let num = [9, 4, 1, 8, 7, 9, 7, 8, 3, 2, 2];
let res = nextPalindrome(num);
console.log(res.join(" "));
`
Output
9 4 1 8 8 0 8 8 1 4 9
**Time Complexity: Worst case O(n × 10ⁿ) because many numbers may be generated before finding the next palindrome, and each palindrome check takes O(n) time.
**Space Complexity: The space complexity is O(n), since the number is stored and processed as an array of digits.
Using Mirror and Carry Propagation - O(n) time and O(n) space
- If all digits are 9, return 1 followed by zeros and ending with 1 (Example: 999 -> 1001).
- Otherwise, Copy the left half to the right to form a palindrome.
- If it is not greater than the original, increase the middle digit (odd length) or middle pair (even length).
- If a carry occurs, propagate it to the left and mirror the left half again to get the next palindrome. C++ `
#include #include using namespace std;
//to check if all digits in num[] are 9 int areAll9s(const vector& num) { for (int i = 0; i < num.size(); ++i) { if (num[i] != 9) return 0; } return 1; }
// generate the next palindrome void nextPalindromeUtil(vector& num) { int n = num.size(); int mid = n / 2; bool leftSmaller = false; int i = mid - 1; int j = (n % 2) ? mid + 1 : mid;
// Compare the left side with the right side
while (i >= 0 && num[i] == num[j]) i--, j++;
// Check if we need to increment the middle digit(s)
if (i < 0 || num[i] < num[j]) leftSmaller = true;
// Copy the left half to the right half
while (i >= 0) {
num[j] = num[i];
j++;
i--;
}
// If middle digits need to be incremented
if (leftSmaller) {
int carry = 1;
i = mid - 1;
if (n % 2 == 1) {
num[mid] += carry;
carry = num[mid] / 10;
num[mid] %= 10;
j = mid + 1;
} else {
j = mid;
}
while (i >= 0) {
num[i] += carry;
carry = num[i] / 10;
num[i] %= 10;
num[j++] = num[i--];
}
}}
vector nextPalindrome(vector& num) { vector ans; if (areAll9s(num)) { ans.push_back(1); for (int i = 1; i < num.size(); i++) ans.push_back(0); ans.push_back(1); } else { nextPalindromeUtil(num); for (int i = 0; i < num.size(); i++) { ans.push_back(num[i]); } } return ans; }
int main() { vector num = {9, 4, 1, 8, 7, 9, 7, 8, 3, 2, 2}; vector result = nextPalindrome(num);
for (int i : result) {
cout << i << " ";
}
cout << endl;
return 0;}
Java
import java.util.*;
class GfG {
//to check if all digits in num[] are 9
static int areAll9s(int[] num) {
for (int i = 0; i < num.length; ++i) {
if (num[i] != 9) return 0;
}
return 1;
}
// generate the next palindrome
static void nextPalindromeUtil(int[] num) {
int n = num.length;
int mid = n / 2;
boolean leftSmaller = false;
int i = mid - 1;
int j = (n % 2 == 1) ? mid + 1 : mid;
// Compare the left side with the right side
while (i >= 0 && num[i] == num[j]) { i--; j++; }
// Check if we need to increment the middle digit(s)
if (i < 0 || num[i] < num[j]) leftSmaller = true;
// Copy the left half to the right half
while (i >= 0) {
num[j] = num[i];
j++;
i--;
}
// If middle digits need to be incremented
if (leftSmaller) {
int carry = 1;
i = mid - 1;
if (n % 2 == 1) {
num[mid] += carry;
carry = num[mid] / 10;
num[mid] %= 10;
j = mid + 1;
} else {
j = mid;
}
while (i >= 0) {
num[i] += carry;
carry = num[i] / 10;
num[i] %= 10;
num[j++] = num[i--];
}
}
}
static int[] nextPalindrome(int[] num) {
int[] ans;
if (areAll9s(num) == 1) {
ans = new int[num.length + 1];
ans[0] = 1;
for (int i = 1; i < num.length; i++) ans[i] = 0;
ans[num.length] = 1;
} else {
nextPalindromeUtil(num);
ans = num.clone();
}
return ans;
}
public static void main(String[] args) {
int[] num = {9, 4, 1, 8, 7, 9, 7, 8, 3, 2, 2};
int[] result = nextPalindrome(num);
for (int i : result) {
System.out.print(i + " ");
}
}}
Python
to check if all digits in num[] are 9
def areAll9s(num): for i in range(len(num)): if num[i] != 9: return 0 return 1
generate the next palindrome
def nextPalindromeUtil(num): n = len(num) mid = n // 2 leftSmaller = False i = mid - 1 j = mid + 1 if (n % 2) else mid
# Compare the left side with the right side
while i >= 0 and num[i] == num[j]:
i -= 1
j += 1
# Check if we need to increment the middle digit(s)
if i < 0 or num[i] < num[j]:
leftSmaller = True
# Copy the left half to the right half
while i >= 0:
num[j] = num[i]
j += 1
i -= 1
# If middle digits need to be incremented
if leftSmaller:
carry = 1
i = mid - 1
if n % 2 == 1:
num[mid] += carry
carry = num[mid] // 10
num[mid] %= 10
j = mid + 1
else:
j = mid
while i >= 0:
num[i] += carry
carry = num[i] // 10
num[i] %= 10
num[j] = num[i]
j += 1
i -= 1def nextPalindrome(num): if areAll9s(num): ans = [1] for i in range(1, len(num)): ans.append(0) ans.append(1) else: nextPalindromeUtil(num) ans = num[:] return ans
if name == "main": num = [9, 4, 1, 8, 7, 9, 7, 8, 3, 2, 2] result = nextPalindrome(num)
for i in result:
print(i, end=" ")C#
using System;
class GfG {
//to check if all digits in num[] are 9
static int areAll9s(int[] num) {
for (int i = 0; i < num.Length; ++i) {
if (num[i] != 9) return 0;
}
return 1;
}
// generate the next palindrome
static void nextPalindromeUtil(int[] num) {
int n = num.Length;
int mid = n / 2;
bool leftSmaller = false;
int i = mid - 1;
int j = (n % 2 == 1) ? mid + 1 : mid;
// Compare the left side with the right side
while (i >= 0 && num[i] == num[j]) { i--; j++; }
// Check if we need to increment the middle digit(s)
if (i < 0 || num[i] < num[j]) leftSmaller = true;
// Copy the left half to the right half
while (i >= 0) {
num[j] = num[i];
j++;
i--;
}
// If middle digits need to be incremented
if (leftSmaller) {
int carry = 1;
i = mid - 1;
if (n % 2 == 1) {
num[mid] += carry;
carry = num[mid] / 10;
num[mid] %= 10;
j = mid + 1;
} else {
j = mid;
}
while (i >= 0) {
num[i] += carry;
carry = num[i] / 10;
num[i] %= 10;
num[j++] = num[i--];
}
}
}
static int[] nextPalindrome(int[] num) {
int[] ans;
if (areAll9s(num) == 1) {
ans = new int[num.Length + 1];
ans[0] = 1;
for (int i = 1; i < num.Length; i++) ans[i] = 0;
ans[num.Length] = 1;
} else {
nextPalindromeUtil(num);
ans = (int[])num.Clone();
}
return ans;
}
static void Main() {
int[] num = {9, 4, 1, 8, 7, 9, 7, 8, 3, 2, 2};
int[] result = nextPalindrome(num);
foreach (int i in result) {
Console.Write(i + " ");
}
}}
JavaScript
// to check if all digits in num[] are 9 function areAll9s(num) { for (let i = 0; i < num.length; ++i) { if (num[i] !== 9) return 0; } return 1; }
// generate the next palindrome function nextPalindromeUtil(num) { let n = num.length; let mid = Math.floor(n / 2); let leftSmaller = false; let i = mid - 1; let j = (n % 2) ? mid + 1 : mid;
// Compare the left side with the right side
while (i >= 0 && num[i] === num[j]) { i--; j++; }
// Check if we need to increment the middle digit(s)
if (i < 0 || num[i] < num[j]) leftSmaller = true;
// Copy the left half to the right half
while (i >= 0) {
num[j] = num[i];
j++;
i--;
}
// If middle digits need to be incremented
if (leftSmaller) {
let carry = 1;
i = mid - 1;
if (n % 2 === 1) {
num[mid] += carry;
carry = Math.floor(num[mid] / 10);
num[mid] %= 10;
j = mid + 1;
} else {
j = mid;
}
while (i >= 0) {
num[i] += carry;
carry = Math.floor(num[i] / 10);
num[i] %= 10;
num[j++] = num[i--];
}
}}
function nextPalindrome(num) { let ans;
if (areAll9s(num)) {
ans = [1];
for (let i = 1; i < num.length; i++) ans.push(0);
ans.push(1);
} else {
nextPalindromeUtil(num);
ans = [...num];
}
return ans;}
// Driver Code let num = [9, 4, 1, 8, 7, 9, 7, 8, 3, 2, 2]; let result = nextPalindrome(num);
console.log(result.join(" "));
`
Output
9 4 1 8 8 0 8 8 1 4 9