LeetCode 415. 字符串相加

题目描述

415. 字符串相加

题目

给定两个字符串形式的非负整数 num1num2,计算它们的和并以字符串形式返回。不能使用任何内置大整数库,也不能直接将输入转换为整数。

示例 1

输入:num1 = "11", num2 = "123"
输出:"134"

示例 2

输入:num1 = "456", num2 = "77"
输出:"533"

示例 3

输入:num1 = "0", num2 = "0"
输出:"0"

提示

  • 1 <= num1.length, num2.length <= 10^4
  • num1num2 都只包含数字 0-9
  • num1num2 都不包含任何前导零,除了数字 0 本身

image-20230304213815480

思路分析

解法一:双指针模拟(推荐)

核心思路

模拟手工加法:两个指针分别从 num1num2 末尾向前扫描,逐位相加并处理进位。

  • 循环条件:p1 >= 0 || p2 >= 0 || carry > 0(任一条件为真则继续)
  • 每次取当前位的数字,若指针已越界则补 0
  • Java 用 StringBuilder 尾部追加后反转,避免字符串拼接的 O(n²) 开销


复杂度分析

  • 时间复杂度:O(max(m, n)),其中 m、n 分别表示 num1num2 的长度。
  • 空间复杂度:O(1),不计返回字符串的空间。
class Solution {
    public String addStrings(String num1, String num2) {
        int p1 = num1.length() - 1, p2 = num2.length() - 1;
        int carry = 0;
        StringBuilder sb = new StringBuilder();

        while (p1 >= 0 || p2 >= 0 || carry > 0) {
            int sum = carry;
            if (p1 >= 0) {
                sum += num1.charAt(p1--) - '0';
            }
            if (p2 >= 0) {
                sum += num2.charAt(p2--) - '0';
            }
            // 尾部追加,最后反转
            sb.append(sum % 10);
            carry = sum / 10;
        }
        return sb.reverse().toString();
    }
}
func addStrings(num1 string, num2 string) string {
	p1, p2 := len(num1)-1, len(num2)-1
	carry := 0
	res := ""
	for p1 >= 0 || p2 >= 0 || carry > 0 {
		sum := carry
		if p1 >= 0 {
			sum += int(num1[p1] - '0')
			p1--
		}
		if p2 >= 0 {
			sum += int(num2[p2] - '0')
			p2--
		}
		res = strconv.Itoa(sum%10) + res
		carry = sum / 10
	}
	return res
}

相似题目

题目 难度 考察点
2. 两数相加 中等 链表加法、进位处理
43. 字符串相乘 中等 大数乘法、逐位模拟
67. 二进制求和 简单 字符串加法、进位处理
989. 数组形式的整数加法 简单 数组加法、进位处理
369. 给单链表加一 中等 链表加法、进位处理
66. 加一 简单 数组加法、进位处理
本文作者:
本文链接: https://hgnulb.github.io/blog/2026/09159489
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!