2. 两数相加

给定两个非空链表来代表两个非负数,位数按照逆序方式存储,它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。

你可以假设除了数字 0 之外,这两个数字都不会以零开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
/**
 * 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 *ans = new ListNode(0);  //答案串     
        ListNode *head = ans;//记录一下答案串的首地址
        int pos = 0; //标记进位
        while (l1 && l2) {//现将相同的位置加上
            int cnt = l1 -> val + l2 -> val + pos;
            pos = cnt > 9 ? 1 : 0;
            ans -> val = cnt % 10;
            l1 = l1 -> next;
            l2 = l2 -> next;
            if (l1 && l2) {
                ans -> next = new ListNode(0);
                ans = ans -> next;
            } else {
                break;
            }
        }      
        // 然后处理后边的数此时ans不是空的,而是指向最后一个节点
        if (l1 == NULL && l2 == NULL) {//加完了
            if (pos) {
                ans -> next = new ListNode(0);
                ans = ans -> next;
                ans -> val = pos;
            }  
        } else if (l1 == NULL) {//第一个链表用完了
            while (l2) {//用完
                ans -> next = new ListNode(0);
                ans = ans -> next;
                int cnt = l2 -> val + pos;
                pos = cnt > 9 ? 1 : 0;
                ans -> val = cnt % 10;
                l2 = l2 -> next;
            } 
            if (pos) {
                ans -> next = new ListNode(0);
                ans = ans -> next;
                ans -> val = pos;
            } 
        } else if (l2 == NULL) {
            while (l1) {//用完
                ans -> next = new ListNode(0);
                ans = ans -> next;
                int cnt = l1 -> val + pos;
                pos = cnt > 9 ? 1 : 0;
                ans -> val = cnt % 10;
                l1 = l1 -> next;
            } 
            if (pos) {
                ans -> next = new ListNode(0);
                ans = ans -> next;
                ans -> val = pos;
            }
        }
        ans = head;
        return ans;     
    }
};

 

posted @ 2018-03-18 20:47  勿忘初心0924  阅读(259)  评论(0编辑  收藏  举报