while (i >= 0 || j >= 0 || carry != 0)含义:
字符串 a 和 b 只要有一个没遍历完,那么就继续遍历;
如果字符串 a 和 b 都遍历完了,但是最后留下的进位 carry != 0,那么需要把进位也保留到结果中。
取 digit 的时候,如果字符串 a 和 b 中有一个已经遍历完了(即 i <= 0或者 j <= 0),则认为 a 和 b 的对应位置是 0 。

2. 两数相加

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例 1:

img

1
2
3
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.

示例 2:

1
2
输入:l1 = [0], l2 = [0]
输出:[0]

示例 3:

1
2
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* head = new ListNode();
ListNode* cur = head;
bool OF = false;
while(l1 != nullptr || l2 != nullptr || OF){
int val = 0;
if(OF)val++;
if(l1 != nullptr){
val += l1->val;
l1 = l1->next;
}
if(l2 != nullptr){
val += l2->val;
l2 = l2->next;
}

if(val > 9){
val -= 10;
OF = true;
}
else OF = false;

cur->next = new ListNode(val);
cur = cur->next;
}
return head->next;
}

67. 二进制求和

给你两个二进制字符串,返回它们的和(用二进制表示)。

输入为 非空 字符串且只包含数字 10

示例 1:

1
2
输入: a = "11", b = "1"
输出: "100"

示例 2:

1
2
输入: a = "1010", b = "1011"
输出: "10101"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
string addBinary(string a, string b) {
int i = (int)a.length() - 1,j = (int)b.length() - 1;
string result;
bool OF = false;
while(i >= 0 || j >= 0 || OF){
char val = '0';
if(OF)val++;
if(i >= 0)val += a[i] - '0';
if(j >= 0)val += b[j] - '0';
i--;j--;

if(val > '1'){
val -= 2;
OF = true;
}
else OF = false;

result = string(1,val) + result;
}
return result;
}

66. 加一

给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。

你可以假设除了整数 0 之外,这个整数不会以零开头。

示例 1:

1
2
3
输入:digits = [1,2,3]
输出:[1,2,4]
解释:输入数组表示数字 123。

示例 2:

1
2
3
输入:digits = [4,3,2,1]
输出:[4,3,2,2]
解释:输入数组表示数字 4321。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
vector<int> plusOne(vector<int>& digits) {
int i = digits.size() - 1;
bool OF = true;
vector<int>result;
while(i >= 0 || OF){
int val = 0;
if(OF)val++;
if(i >= 0)val += digits[i--];

if(val > 9){
val -= 10;
OF = true;
}
else OF = false;

result.push_back(val);
}
reverse(result.begin(),result.end());
return result;
}

415. 字符串相加

给定两个字符串形式的非负整数 num1num2 ,计算它们的和并同样以字符串形式返回。

你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。

示例 1:

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

示例 2:

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

示例 3:

1
2
输入:num1 = "0", num2 = "0"
输出:"0"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
string addStrings(string num1, string num2) {
int i = num1.length() - 1, j = num2.length() - 1;
bool OF = false;
string result;
while(i >= 0 || j >= 0 || OF){
char val = '0';
if(OF)val++;
if(i >= 0)val += num1[i] - '0';
if(j >= 0)val += num2[j] - '0';
i--;j--;

if(val > '9'){
OF = true;
val -= 10;
}
else OF = false;

result = string(1,val) + result;
}
return result;
}

989. 数组形式的整数加法

整数的 数组形式 num 是按照从左到右的顺序表示其数字的数组。

  • 例如,对于 num = 1321 ,数组形式是 [1,3,2,1]

给定 num ,整数的 数组形式 ,和整数 k ,返回 整数 num + k数组形式

示例 1:

1
2
3
输入:num = [1,2,0,0], k = 34
输出:[1,2,3,4]
解释:1200 + 34 = 1234

示例 2:

1
2
3
输入:num = [2,7,4], k = 181
输出:[4,5,5]
解释:274 + 181 = 455
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
vector<int> addToArrayForm(vector<int>& num, int k) {
int i = num.size() - 1;
bool OF = false;
vector<int>result;
while(i >= 0 || k != 0 || OF){
int val = 0;
if(OF)val++;
if(i >= 0)val += num[i];
if(k != 0)val += k%10;
k /= 10;i--;

if(val > 9){
val -= 10;
OF = true;
}
else OF = false;

result.push_back(val);
}
reverse(result.begin(),result.end());
return result;
}