题目
题干解析
给你两个非空链表,要你把他们“加”起来,并且返回答案链表。所谓的加就是每对应的两个节点数相加,要注意到的是,答案不能超过10,只有一位数,而如果超过10的话要进位。
知识点
数据结构之链表
难度
中等
解题思路
这道题主要考察对链表的熟悉程度,主要就是对新节点的生成,添加进原链表的操作的训练,其它的注意一下进位的要求。从两个链表的第一节点开始往后加,每到一个新的节点要给答案生成一个新的节点,当某个节点被加完时,要检测另一个节点是否被加完,如果没有,剩下的操作就是将未被加完的链表的节点加入答案中,同样要注意进位。代码里注释得比较清楚,详细解题思路请见代码。
代码
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode *ans; // 答案的头指针
bool flag = false; // 标记是否有进位
int sum = l1->val + l2->val;
if (sum >= 10) { // 因为都是1位数,所以十位的数要舍去,保留个位数,但是要标记有进位
sum -= 10;
flag = true;
}
ListNode *temp = new ListNode(sum); // 新生成一个节点
ans = temp; // 将该节点赋给头指针
while (l1->next != NULL && l2->next != NULL) { // 如果两个链表都不为空的话
l1 = l1->next;
l2 = l2->next;
int sum = l1->val + l2->val;
if (flag) { // 如果之前有进位
sum++; // 把进位的1加到当前位
flag = false;
}
if (sum >= 10) { // 如果大于10,要舍去十位数,保留个位数,并标记有进位
sum -= 10;
flag = true;
}
ListNode *next_temp = new ListNode(sum); // 新建一个节点
temp->next = next_temp; // 将该节点插到原链的尾部
temp = next_temp;
}
if (l1->next != NULL) { // 如果l1还没有加完而l2加完了,接下里要将l1的东西加给答案
while (l1->next != NULL) {
l1 = l1->next;
int val = l1->val;
if (flag) {
val++;
flag = false;
}
if (val >= 10) {
val -= 10;
flag = true;
}
ListNode *next_temp = new ListNode(val);
temp->next = next_temp;
temp = next_temp;
}
} else if (l2->next != NULL) { // 如果l2还没有加完而l1加完了,接下里要将l2的东西加给答案
while (l2->next != NULL) {
l2 = l2->next;
int val = l2->val;
if (flag) {
val++;
flag = false;
}
if (val >= 10) {
val -= 10;
flag = true;
}
ListNode *next_temp = new ListNode(val);
temp->next = next_temp;
temp = next_temp;
}
}
if (flag) { // 如果l1和l2都加完了,检查是否还有进位,有的话,还要再加一个值为1的节点。
ListNode *next_temp = new ListNode(1);
temp->next = next_temp;
temp = next_temp;
}
return ans;
}
};