2. 两数相加

Posted 勿忘初心0924

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;     
    }
};

 

以上是关于2. 两数相加的主要内容,如果未能解决你的问题,请参考以下文章

代码题(11)— 链表两数相加

leetcode-2. 两数相加

LeetCode第2天 - 2. 两数相加

链表题--02----两数相加

LeetCode 2.两数相加

leetcode 算法题2 两数相加