[leetcode2][指针]两数相加

发布于 2021-10-30  900 次阅读


https://leetcode-cn.com/problems/add-two-numbers/

说实话 我觉得这种题挺恶心的 真不喜欢链表和指针这种东西 思路很简单 具体看代码

方法1:补齐后运算

#include <bits/stdc++.h>
using namespace std;


class Solution
{
public:
  ListNode *addTwoNumbers(ListNode *l1, ListNode *l2)
  {
    int len1 = 1;
    int len2 = 1;
    ListNode *p = l1;
    ListNode *q = l2;
    while (p->next != nullptr)
    {
      len1++;
      p = p->next;
    }
    while (q->next != nullptr)
    {
      len2++;
      q = q->next;
    }
    if (len1 > len2)
    { //l1长 补l2
      for (int i = 1; i <= len1 - len2; i++)
      {
        q->next = new ListNode(0);
        q = q->next;
      }
    }

    else
    { //l2长 补l1

      for (int i = 1; i <= len2 - len1; i++)
      {
        p->next = new ListNode(0);
        p = p->next;
      }
    }
    //指针归位
    p = l1;
    q = l2;
    bool jud = 0; //记录进位
    ListNode *ans = new ListNode(1);
    ListNode *l3 = ans;
    int i = 0;
    while (p != nullptr && q != nullptr)
    {
      i = jud + p->val + q->val;

      l3->next = new ListNode(i % 10);
      jud = i >= 10 ? 1 : 0;
      p = p->next;
      q = q->next;
      l3 = l3->next;
    }
    if (jud)
    {
      l3->next = new ListNode(1);
      l3 = l3->next;
    }
    ListNode *preDelete=ans;
    ans=ans->next;
    delete preDelete;
    return ans;
  }
};

方法2:不补齐直接算

#include <bits/stdc++.h>
using namespace std;


class Solution
{
public:
  ListNode *addTwoNumbers(ListNode *l1, ListNode *l2)
  {
    ListNode* head=new ListNode(-1);
    ListNode* h=head;
    int sum=0;//每位相加的答案
    int carry=false;//进位
    while (l1!=nullptr||l2!=nullptr)
    {
      sum=carry;//带上进位标志
      //取数
      if(l1!=nullptr){
        sum+=l1->val;
        l1=l1->next;
      }
      if(l2!=nullptr){
        sum+=l2->val;
        l2=l2->next;
      }
      h->next=new ListNode(sum%10);
      h=h->next;
      carry=sum>=10?1:0;
    }
    if(carry){
      h->next=new ListNode(1);
    }
    ListNode* preDelete=head;
    head=head->next;
    delete preDelete;
    return head;
  }
};

愿风指引你的道路,愿你的刀刃永远锋利。