两数相加
地址:https://leetcode-cn.com/problems/add-two-numbers/
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
示例 2:
输入:l1 = [0], l2 = [0]
输出:[0]
示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
方法1 暴力循环法
思路:
l1 l2 逆序后相加 在逆序转化为数组返回
从大到小遍历数组l1 l2 ,拼接为字符串,转化为int 相加后 再转化为字符串
便利字符串存入数组返回
干代码
- (NSMutableArray *)addTwoNumbersWithArry1:(NSArray *)l1 withArray2:(NSArray *)l2
{
NSInteger t1 = [self getOptionInteger:l1];
NSInteger t2 = [self getOptionInteger:l2];
NSInteger t3 = t1 + t2;
NSString *str = [NSString stringWithFormat:@"%ld",t3];
NSMutableArray *arr = [NSMutableArray array];
for (NSInteger i = str.length-1; i >= 0; i--) {
NSString *character = [NSString stringWithFormat:@"%c",[str characterAtIndex:i]];
[arr addObject:character];
}
return arr;
}
- (NSInteger)getOptionInteger:(NSArray *)arr
{
NSString *str = @"";
for (NSInteger i=arr.count-1; i>=0; i--) {
str = [NSString stringWithFormat:@"%@%@",str,arr[i]];
}
return str.integerValue;
}
这方法循环太多 不好
方法2 位数相加进一法
思路 看例子 是逆序相加 在 逆序返回数据
l1 2 4 3
l2 5 6 4
l1 l2 逆序后 当前显示的就是 个位 十位 百位 千位 。。。。
注意
相加后大于10 进一的情况 需要有个字段表示是不是进1
两个数组位数不同的情况,我们以长度大的为最大长度循环,因为是逆序不足的在后面所以以0补充
某个位数相加后的值是 数组中的数相加 再加上前一个位数的进1 这个的1需要先加上
最后的进1 需要在循环结束后判断,表示新增加一位
干代码
- (NSMutableArray *)addTwoNumbers2WithArry1:(NSArray *)l1 withArray2:(NSArray *)l2
{
NSMutableArray *arr = [NSMutableArray array];
//1.先判断哪个长度最大
NSInteger max = l1.count > l2.count ? l1.count : l2.count;
//2.前一位相加后是否需要进1,addNumber这个值为0或者1
NSInteger addNumber = 0;
//3.循环
for (NSInteger i=0; i<max; i++) {
//4.这里需要注意判断数组是否越界,越界表示位数不足,直接判断为0 即可
NSNumber *num1 = i >= l1.count ? 0 : l1[i];
NSNumber *num2 = i >= l2.count ? 0 : l2[i];
//5.位数相加 需要判断是否>10 大于10表示 这里重点是需要加上上个位数新增加的
NSInteger index = num1.integerValue + num2.integerValue + addNumber;
//6.index%10 表示这个位置相加后的数字(小于10) addNumber是前一个位置是否有进1 相加后就表示这个位置的最终值
NSInteger a = index%10;
[arr addObject:@(a)];
//7.新计算的addNumber 表示下一位是否需要进1
addNumber = index >= 10 ? 1 : 0;
}
//8.最后这里还需要判断是否需要新增加1
if (addNumber > 0) {
[arr addObject:@(addNumber)];
}
return arr;
}