【刷 题】:两数相加
题目:给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 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; //返回指向新链表的头指针
}
};
解题思路:因为是逆序,所以两链表可以同位置相加,末尾相加,代入两数相加的计算方式,进位的想法
