5.11【leetcode刷题】2.两数相加

36 阅读1分钟

以下为自己实现的

 * 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* l3 = new ListNode();
        ListNode *p, *pre, *m, *n = nullptr;
        m = l1;
        n = l2;
        pre = l3;
        p = l3;
        while (m != nullptr || n != nullptr) {
            int tem = 0;
            if(m != nullptr && n != nullptr){
                l3->val = m->val + n->val;
                if (p->val >= 10) {
                    tem = p->val / 10;
                    p->val = p->val % 10;
                }
                m = m->next;
                n = n->next;
                pre->val += tem;
                pre = p;
                p = new ListNode();
                p->next = l3;
                l3 = p;
                }
            if (n == nullptr && m != nullptr) {
                p = m;
                p->next = l3;
                p = new ListNode();
                p->next = l3;
                l3 = p;
            }
            if (m == nullptr && n != nullptr) {
                p = n;
                p->next = l3;
                p = new ListNode();
                p->next = l3;
                l3 = p;
            }
        }
        if(l3->val==0){
            l3=l3->next;
        }
        return l3;
    }
};

大概思路是正确的,但是细节问题很多:

1.最后输出的链表l3总会多出一个结点数值为0;

2.网页运行时,超出内存限制;

3.l1,l2两链长度不同时尾链的处理有问题

下为官方答案

public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode *head = nullptr, *tail = nullptr;
        int carry = 0;
        while (l1 || l2) {
            int n1 = l1 ? l1->val: 0;
            int n2 = l2 ? l2->val: 0;
            int sum = n1 + n2 + carry;
            if (!head) {
                head = tail = new ListNode(sum % 10);
            } else {
                tail->next = new ListNode(sum % 10);
                tail = tail->next;
            }
            carry = sum / 10;
            if (l1) {
                l1 = l1->next;
            }
            if (l2) {
                l2 = l2->next;
            }
        }
        if (carry > 0) {
            tail->next = new ListNode(carry);
        }
        return head;
    }
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/add-two-numbers/solutions/435246/liang-shu-xiang-jia-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。