力扣 2.两数相加

题目描述

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

实例

在这里插入图片描述

思路

将两个链表补成长度一致的,短的在后边补零。注意的是最后一位相加可能产生进位。

my code

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode *l3 = new ListNode(-1); 
        ListNode *p = l1; ListNode* q = l2; ListNode* w = l3;
        int temp = 0; 
        while(p->next || q->next){
            if(p->next&&q->next){
                p = p->next;
                q = q->next;
            }
            if(p->next == nullptr && q->next){
                p->next = new ListNode(0);
                p = p->next;
                q = q->next;
            }
            if(p->next && q->next == nullptr){
                q->next = new ListNode(0);
                q = q->next;
                p = p->next;
            }
        }
        // 用下面这段代码总是不能ac, 原因是当p指向nullptr时候,再给他分配值就是另找堆内存分配,不会连在原来的链表上,所以补零不起作用,应该用p->next来写
        //  while(p || q){
        //     if(p&&q){
        //         p = p->next;
        //         q = q->next;
        //     }
        //     if(p == nullptr && q){
        //         p = new ListNode(0);
        //         p = p->next;
        //         q = q->next;
        //     }
        //     if(p && q == nullptr){
        //         q = new ListNode(0);
        //         q = q->next;
        //         p = p->next;
        //     }
        // }
        p = l1; q = l2;
        while(p&&q)
        {
            int add = p->val + q->val;
            w->next = new ListNode((add+temp)%10);
            temp = (add + temp) > 9 ? 1 : 0;
            p = p->next;
            q = q->next;
            w = w->next;
        }
        if(temp == 1){
            w -> next = new ListNode(1);
            w = w->next;}
        return l3 -> next;
    }
};

出错的点就是注释中所描述的,反思一下,好久快一年多没刷c++的题了,由于跨专业,c++也是自学的,好多东西也都忘记了,现在想陆续重新拾起来,多刷题吧。。。

你可能感兴趣的:(C++,刷题)