2. 两数相加
题目
2. 两数相加
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 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, 100]内 0 <= Node.val <= 9- 题目数据保证列表表示的数字不含前导零
解题思路:
定义变量a,用于单个数相加时满十进一的判断。
逐项相加,根据a建立单链表
结题代码:
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { ListNode* Add=nullptr; //Add用于存储结果 L用于建立Add链表 ListNode* L; ListNode* H; //尾插法建链 int a=0; //判断前一个数是否是否满10,当前数进1 while(l1!=nullptr||l2!=nullptr){ L=new ListNode(); L->next=nullptr; L->val=0; if(l1!=nullptr){ L->val+=l1->val; l1=l1->next; } if(l2!=nullptr){ L->val+=l2->val; l2=l2->next; } L->val+=a; a=0; // 优化2: L->val=l1->val+l2->val+a; /* if(a==1) //优化1:为直接val加a,然后a赋值0; { L->val++; a=0; }*/ if(L->val>=10){ L->val=L->val%10; a=1; } //建链表 if(Add==nullptr) { Add=L; H=L; } else{ H->next=L; H=H->next; } } return Add; } };
*原本使用的是 malloc 申请空间,结果报错,改用new,对于malloc和new的区别认识不够
运行结果:
通过测试用例:1365 / 1568
输入:
[9,9,9,9,9,9,9] [9,9,9,9]
输出:
[8,9,9,9,0,0,0]
预期结果:
[8,9,9,9,0,0,0,1]
问题:循环完成时a=1的情况没有考虑到位,导致错误.
解决方案:
if(a==1){ L=new ListNode(); L->val=a; H->next=L; L->next=nullptr;
运行结果:AC
执行用时:24 ms, 在所有 C++ 提交中击败了77.98%的用户
内存消耗:69.4 MB, 在所有 C++ 提交中击败了73.72%的用户
通过测试用例:1568 / 1568
做题反思:
1.尾插法建链时发生错误,想着使用一个指针就可以建链表,L=L->next;L=malloc; 然而,逻辑错误,L申请空间和建成的单链表毛关系没有,导致单链表建立失败,L申请空间后其值也会改变
2.课本上使用malloc建节点,练习时使用malloc也没有问题,在力扣却发生错误。

浙公网安备 33010602011771号