lc445
1.首先先上题解
class Solution {
public:
ListNode *ChangeList(ListNode *l1) {
//链表相关题目之-反转链表
ListNode *pre = NULL; //定义一个前指针
ListNode *cur = l1; //定义一个当前指针
while (cur != nullptr) {
ListNode *Next = cur->next; //定义一个后指针
cur->next = pre;
pre = cur;
cur = Next;
}
return pre;
}
ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) {
//第二题的变种,我们如果沿用第二题的解法的话,我们首先应该反转下链表,然后用第二题的思路进行,最后再反转回来
ListNode *l3 = ChangeList(l1);
ListNode *l4 = ChangeList(l2);
//之后就是正常的处理就可以了
ListNode *p = l3;
ListNode *q = l4;
ListNode *res = new ListNode(-1);
ListNode *cur = res; //遍历指针
int carry = 0; //记录进位
while (p || q) {
int x = (p != nullptr) ? p->val : 0;
int y = (q != nullptr) ? q->val : 0;
int sum = x + y + carry;
carry = sum / 10; //将进位进行更新
int num = sum % 10;
cur->next = new ListNode(num);
cur = cur->next;
p = p == nullptr ? p : p->next;
q = q == nullptr ? q : q->next;
}
if (carry > 0) {
cur->next = new ListNode(carry);
}
return ChangeList(res->next);
}
};
2.思路简析 这道题目其实是lc2的变形题目,于是我直接就偷了一个懒先将链表反转下,然后套用lc2的解题思路,解决了。具体思路可以看下lc2的题解。