欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Add Two Numbers算法

程序员文章站 2024-03-17 21:55:58
...

You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

You may assume the two numbers do not contain any leading zero, except the number 0 itself.

Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8


这道题,一开始我是想投机取巧的,想先提取出342和564,然后相加等于807,再逐个放进ListNode里面的。

经过一系列的DeBug之后,我觉得已经ok了。然而......

Add Two Numbers算法

Add Two Numbers算法

我也很难受啊,可我能怎么办嘛。怎么办?重打呗!


正题部分来了


既然这种投机取巧不行,那就老老实实地逐位相加吧

/**
 * 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* p1 = l1;
        ListNode* p2 = l2;
        ListNode* temp ;
        int a = 0, b = 0,carry = 0;
        while(l1) {
            a++;
            l1 = l1->next;
        }
        while(l2) {
            b++;
            l2 = l2->next;
        }
        if(a >= b){
            temp = p1;
            while(p1){
                if(p2){
                    p1->val = p1->val + p2->val + carry;
                    carry = 0;
                    if(p1->val >= 10) {
                        p1->val -= 10;
                        carry = 1;
                    }
                    p2 = p2->next;
                }
                else {
                    p1->val = p1->val + carry;
                    carry = 0;
                    if(p1->val >= 10) {
                        p1->val -= 10;
                        carry = 1;
                    }
                }
                if(p1->next == NULL && carry == 1) {
                    p1->next = new ListNode(1);
                    break;
                }
                p1 = p1->next;
            }
        }
        else{
            temp = p2;
            while(p2){
                if(p1){
                    p2->val = p2->val + p1->val + carry;
                    carry = 0;
                    if(p2->val >= 10) {
                        p2->val -= 10;
                        carry = 1;
                    }
                    p1 = p1->next;
                }
                else {
                    p2->val = p2->val + carry;
                    carry = 0;
                    if(p2->val >= 10) {
                        p2->val -= 10;
                        carry = 1;
                    }
                }
                if(p2->next == NULL && carry == 1) {
                    p2->next = new ListNode(1);
                    break;
                }
                p2 = p2->next;
            }
        }
        return temp;
    }
};

然后呢,大概就是这样,要注意的地方就是进位那里了,这里我用carry来表示进位。

还有,就是空指针,比如说,3-4-5-6 加上1-2-3,就不能一味地使用 p1->val + p2->val + carry,当第4位相加时,p2的第4位已然是空的,就不能再调用p2了,这样会出现空指针的错误。