[LeetCode] 2. Add Two Numbers

陪她去流浪 桃子 2014年10月27日 编辑 阅读次数:1977

链接

Add Two Numbers | LeetCode OJ

描述

有两个代表非负整数的非空单链表,链表的每一个结点代表一个十进制位,反向存储的。把这两个数字相加,并反其结果。

提示

除了数值 0 以外,不用考虑有前导 0 的情况。

举例

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8

思路

由于十进制位是逆序保存在链表中的,所以顺序遍历链表正好得到个位、十位、百位……,正好方便从低位开始相加。唯一需要注意的就是高位不存在的情况。题目本身是很简单的。

代码

/**
 * 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* phead = NULL;
        ListNode* prev = NULL;
        bool carry = false;

        for(;;){
            int sum = int(carry);
            if(l1) sum += l1->val;
            if(l2) sum += l2->val;
        
            carry = sum >= 10;
            if(carry) sum -= 10;
        
            ListNode* pcur = new ListNode(sum);
            if(prev == NULL){
                prev = pcur;
                phead = pcur;
            }
            else{
                prev->next = pcur;
                prev = pcur;
            }
        
            if(l1) l1 = l1->next;
            if(l2) l2 = l2->next;
        
            if(!l1 && !l2){
                break;
            }
        }

        if(carry){
            ListNode* pa = new ListNode(1);
            prev->next = pa;
            pa->next = NULL;
            prev = pa;
        } 

        prev->next= NULL;
        return phead;
    }
};

标签:LeetCode