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也没有问题,在力扣却发生错误。
posted @ 2022-02-21 17:10  王璞  阅读(97)  评论(0)    收藏  举报