【leetcode】刷题家之2. Add Two Numbers

2. Add Two Numbers

请看题

例子

思路

一开始的思路是获取到链表的最后一个元素,然后从后到前来算结果,但是这样子想好像做不到。

后面看了解题的视频,发现有一个惊为天人的解法!

我们只需要相加每一个链表当前的节点,如果有进位,比如7+8 → 15,就把这个1放到下一个节点来进行相加。根据这个思路我们就可以开始解题了。

首先如果传入的两个链表有一个为空,那么直接返回另外一个。

然后定义一个result,一个当前节点,一个进位值。

当两个链表都不为空并且进位不等于0的时候进入循环,在循环内算有无进位,如果有,当前节点的下一个节点取模,再把进位 / 10.

最后只需要把链表的指针移到下一个就好了

代码

/**
 * 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) {
        if(!l1) {return l2;}
        if(!l2) {return l1;}

        ListNode result(0);

        ListNode *current = &result;
        int carry = 0;

        while (l1 || l2 || carry != 0){

            carry += (l1 ? l1->val : 0) + (l2 ? l2->val : 0);
            current->next = new ListNode(carry % 10);
            carry = carry / 10;

            current = current->next;

            l1 = l1 ? l1->next : nullptr;
            l2 = l2 ? l2->next : nullptr;
        }
        return result.next;
    }
};
1 个赞

刷题佬!