【iOS每日算法】两数相加,给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。

题目:

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

考察点:

  • 这是一道LeetCode上非常基础的一道算法题。个人觉得考察点就是,用尽量小的时间复杂度去解题。因为如果一开始思路是先把链表中的数转成两个整数再sum,之后再放进链表里也是一个思路,但这样会循环两遍链表。但因为两个链表中的个位,十位百位都是一致的,所以一次循环,各位相加进位,并放入链表就可以解决问题。这样就少做两次循环,是更优解法。

解法:

一、循环两个链表对应各位,并相加
  • 这里链表用数组表示,理解算法思路即可

- (NSArray *)sumNum:(NSArray<NSNumber *>*)numArr1 withNum2:(NSArray<NSNumber *>*)numArr2 {
    NSInteger len1 = numArr1.count;
    NSInteger len2 = numArr2.count;
    NSMutableArray *totalArr = [NSMutableArray array];
    for(int i = 0; (i < len1 || i < len2); i++) {
        int sumNum = (i < len1 ? [numArr1[i] intValue] : 0) + (i < len2 ? [numArr2[i] intValue] : 0) + (i < totalArr.count ? [totalArr[i] intValue] : 0);
        if(sumNum < 10) {
            totalArr[i] = @(sumNum);
        } else {
            totalArr[i] = @(sumNum % 10);
            totalArr[i + 1] = @(1);
        }
    }
    return totalArr;
}


二、先算出两数之和,然后放入数组
  • 这个解法比上一个复杂,但是更容易想到,毕竟直接相加两个数,要比各位数相加进位要容易。但实际上多进行了两次循环。
- (NSArray *)twoSumNum:(NSArray<NSNumber *>*)numArr1 withNum2:(NSArray<NSNumber *>*)numArr2 {
    int num1 = 0;
    int num2 = 0;
    for (int i = 0; i < numArr1.count; i++) {
        num1 = num1 + [numArr1[i] intValue] * pow(10, i);
    }
    for (int i = 0; i < numArr2.count; i++) {
        num2 = num2 + [numArr2[i] intValue] * pow(10, i);
    }
    int totalNum = num1 + num2;
    NSMutableArray *totalArr = [NSMutableArray array];
    for(int i = 0;;i++) {
        int num = (totalNum % [@(pow(10, i + 1)) intValue]) / [@(pow(10, i)) intValue];
        int yushu = totalNum / [@(pow(10, i + 1)) intValue];
        totalArr[i] = @(num);
        if(yushu <= 0) {
            return totalArr;
        }
    }
}

总结

  • 从这道题中我们可以学到如何更好的利用数据和数据的结构,而不是简单的去处理问题,更好的算法和思路能为程序节省很多资源,提升效率。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。