LeetCode Day2 add_two_numbers

C++:

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        int carry=0;
        ListNode *head=new ListNode;
        while(l1!=NULL && l2!=NULL){
            basic=(l1->val+l2->val+carry)%10;
            carry=(l1->val+l2->val+carry)/10;
            result->next=new ListNode(basic);
            result=result->next;
            l1=l1->next;
            l2=l2->next;
        }
        while(l1!=NULL){
            basic=(l1->val+carry)%10;
            carry=(l1->val+carry)/10;
            result->next=new ListNode(basic);
            result=result->next;
            l1=l1->next;
        }
        while(l2!=NULL){
            basic=(l2->val+carry)%10;
            carry=(l2->val+carry)/10;
            result->next=new ListNode(basic);
            result=result->next;
            l1=l1->next;
        }
        
        return head->next;
        
    }
};

第一遍写的,比较睿智。。改写一下:

class Solution {
public:
    ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) {
        ListNode *res = new ListNode(-1);
        ListNode *cur = res;
        int carry = 0;
        while (l1 || l2) {
            int n1 = l1 ? l1->val : 0;
            int n2 = l2 ? l2->val : 0;
            int sum = n1 + n2 + carry;
            carry = sum / 10;
            cur->next = new ListNode(sum % 10);
            cur = cur->next;
            if (l1) l1 = l1->next;
            if (l2) l2 = l2->next;
        }
        if (carry) cur->next = new ListNode(1);
        return res->next;
    }
};

网上的答案:

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode * ret=new ListNode(0);
        ListNode * cur=ret;
        bool carry=0;
        int sum=0;
        while(l1||l2||carry){
            int sum=0;
            if(l1){
                sum+=l1->val;
                l1=l1->next;
            }
            if(l2){
                sum+=l2->val;
                l2=l2->next;
            }
            if(carry) sum++;
            carry=(sum>=10);
            cur=(cur->next=new ListNode(sum%10));
             
        }
        return ret->next;
    }
};

迭代,速度快了好多

class Solution {
public:
    // Note - do not try to compute as a single integer first as the test cases
    // try to catch you out if you do that. You have to accumulate the 
    // nodes in the result one by one.
    ListNode *addTwoNumbers(ListNode *p1, ListNode *p2) {
        return addTwoNumbers(p1, p2, 0);
    }

    static ListNode *addTwoNumbers(ListNode *p1, ListNode *p2, int carry) {
        if (!p1 && !p2) {
            if (0 != carry) {
                return new ListNode(carry);
            } else {
                return nullptr;
            }
        }
        
        int first = p1 ? p1->val : 0;
        int second = p2 ? p2->val : 0;

        int digit = (carry + first + second) % 10;
        int nextCarry = (carry + first + second) / 10;
        
        ListNode *pResult = new ListNode(digit);
        pResult->next = addTwoNumbers(
            p1 ? p1->next : nullptr,
            p2 ? p2->next : nullptr,
            nextCarry
        );
        return pResult;
    }
};

Python:

class Solution:
    def addTwoNumbers(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        ret=ListNode(0)
        cur=ret
        carry=0
        while(l1 or l2 or carry):
            sum=0
            if l1:
                sum+=l1.val
                l1=l1.next
            if l2:
                sum+=l2.val
                l2=l2.next
            sum+=carry
            cur.next= ListNode(sum%10)
            cur=cur.next
            carry=(sum>=10)
        return ret.next

猜你喜欢

转载自blog.csdn.net/weixin_41394379/article/details/82930677
今日推荐