根据题目所给的信息可以很清楚的判断这是一个链表的题目,链表中的数如图所示排列。
题目给了很清晰的描述,所以可以直接进行简单的模拟算法,以此来完成该题的解题。
/**
* 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 *root = new ListNode(0);//创建链表
ListNode *cursor = root;//创建链表cursor指向链表root
int carry = 0;//定义一个数记录进位
while(l1 != nullptr || l2 != nullptr || carry != 0){//循环判断条件
int l1Val = l1 != nullptr ? l1->val : 0;
int l2Val = l2 != nullptr ? l2->val : 0;
int sumVal = l1Val + l2Val + carry;
carry = sumVal / 10;//将相加得到的数/10,用以进位
ListNode *sumNode = new ListNode(sumVal % 10);//创建链表储存相加后%10得到的数
cursor->next = sumNode;//cursor的next指向该链表
cursor = sumNode;//将sumVal传递给cursor
if(l1 != nullptr)l1 = l1->next;
if(l2 != nullptr)l2 = l2->next;
}
return root->next;//输出链表
}
};
题解的整体思路是先创建一个链表来储存最后的结果,然后创建一个链表来指向该链表,再用一个数carry来记录相加后的进位,该想法的优点是不用判断再复杂的判断是否需要进位。后面就是整体的一个while循环,循环判断的条件是链表l1和l2不为空,且没有进位。循环的里面
int l1Val = l1 != nullptr ? l1->val : 0;
int l2Val = l2 != nullptr ? l2->val : 0;
int sumVal = l1Val + l2Val + carry;
carry = sumVal / 10;
是用来将l1和l2的链表中的数和进位carry相加。
ListNode *sumNode = new ListNode(sumVal % 10);
cursor->next = sumNode;
cursor = sumNode;
后面就是将相加所得到的数链表sumNode储存起来。