类型一从题-lc445

133 阅读1分钟

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的题解。