【刷 题】:两数相加

题目:给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头

示例2:输入:l1 = [0], l2 = [0] 输出:[0]

示例3:输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9] 输出:[8,9,9,9,0,0,0,1]

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode *head = nullptr, *tail = nullptr;  // 设置同类型的头指针和尾指针
        int carry = 0;                              //将进位值设置为零
        while(l1 || l2)                             //只要L1和L2的指针都不为空,则一直循环
        {
            int n = l1 ? l1->val:0;                 //将L1的值提取出来,指针不为空则返回值,否则返回零
            int m = l2 ? l2->val:0;                 //将L2的值提取出来,指针不为空则返回值,否则返回零
            int sum = n + m + carry;                //创建变量sum存储两数加上进位值的和

            if(!head)                               //初始化新创建的链表
                head = tail = new ListNode(sum % 10); //将头尾指针都指向第一个新创建的节点(值为sum的余数,即就是个位数上的值)
            else
            {
                tail->next = new ListNode(sum % 10);  //随后每次都是next连接新创建的节点(值为sum的余数,即就是个位数上的值)
                tail = tail->next;                   //尾指针指向新创建的节点
            }

            carry = sum/10;                          //进位值为sum的十位数的值

            if(l1)                                   //只要L1指针不为空,则指向下一个节点
                l1 = l1->next;
            if(l2)                                  //只要L1指针不为空,则指向下一个节点
                l2 = l2->next;
        }
            if(carry > 0)                          //循环结束,如果还存在进位值不为零,则最后创建一个节点(值为进位值)
            {
                tail->next = new ListNode(carry);
                tail = tail->next;
            }
            
            return head;                          //返回指向新链表的头指针
    }
};

解题思路:因为是逆序,所以两链表可以同位置相加,末尾相加,代入两数相加的计算方式,进位的想法

经验分享 程序员 微信小程序 职场和发展