Secara teori bisa, tapi secara praktik TIDAK disarankan dan akan gagal untuk kasus angka besar. Mari kita bahas kenapa:
[ typescript ]
❌ Kenapa tidak bisa menggunakan cara:
ListNode → Array → reverse → join("") → Number → tambah
Karena:
-
Limit Number di JavaScript
- JavaScript menggunakan tipe
Numberberbasis IEEE 754 double precision - Maksimal angka akurat hanya sampai 15–16 digit
- Angka lebih dari itu akan jadi notasi ilmiah (1e+30) dan kehilangan presisi
- JavaScript menggunakan tipe
Contoh kasus:
x = 1000000000000000000000000000001 (31 digit)
y = 465
Number(x) = 1e+30 ❌ Tidak akuratOutput jadi NaN saat dikonversi balik ke array digit.
✅ Kenapa Harus pakai logika digit per digit (tanpa Number)
Karena ListNode itu dirancang untuk merepresentasikan bilangan sangat besar, bahkan tak terbatas, dengan bentuk digit linked list reverse.
Prinsip algoritma:
- Ambil masing-masing digit dari
l1danl2 - Tambahkan dengan
carry - Masukkan digit satu per satu ke ListNode baru
- Tidak pernah mengubah ke tipe Number
🔍 Ilustrasi Debug Per Iterasi
Misal:
l1 = 2 -> 4 -> 3 (342)
l2 = 5 -> 6 -> 4 (465)| Iterasi | x | y | carry | sum = x+y+carry | digit (sum%10) | carry (Math.floor(sum/10)) |
|---|---|---|---|---|---|---|
| 1 | 2 | 5 | 0 | 7 | 7 | 0 |
| 2 | 4 | 6 | 0 | 10 | 0 | 1 |
| 3 | 3 | 4 | 1 | 8 | 8 | 0 |
| Hasil ListNode | 7 -> 0 -> 8 (807) ✅ |
🎯 Kesimpulan:
| Metode | Bisa untuk angka kecil | Bisa untuk angka besar | Aman presisi | Disarankan |
|---|---|---|---|---|
| Convert ke Number lalu tambah | ✅ | ❌ | ❌ | ❌ |
| Tambah digit per digit (asli) | ✅ | ✅ | ✅ | ✅ |
Jadi :
❌ Tidak boleh pakai cara convert ke array lalu ke string lalu Number, karena JavaScript Number tidak mampu menangani angka besar dengan akurat.