leetcode 2.两数相加

 leetcode神评曾言道:

有人相爱,有人也里开车看海,有人leetcode第一题做不出来。

/**
 * 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 *l3 = new ListNode(0);//分配空间
        ListNode *ans = l3;//这里分配一个活动的指针
      int len1, len2, len;//链表1的长度,链表2的长度,最大的长度
      len1 = read(l1);
      len2 = read(l2);//读取长度
      len = max(len1, len2);//比较
      if (len1 < len2)//平齐,len1 = len2就不要了,算是省一点点时间吧,不过没有什么用-_-
      {
          put_zero(l1, len1, len);
      }
      else if (len2 < len1)
      {
          put_zero(l2, len2, len);
      }
      int cnt, r;//cnt是对应位数的和,r是余数
      r = 0;//初始化
      for (int i = 1; i <= len; i++)
      {
          ans->next = new ListNode(0);//新开内存
          ans = ans->next;//前进一个单位
          cnt = l1->val + l2->val;//和
          if (r + cnt >= 10)//和大于十的话
          {
              ans->val = (r + cnt) % 10;//取余数
              r = (r + cnt) / 10;//整除
          }
          else
          {
              ans->val = r + cnt;
              r = 0;//这里要小心,r被使用了之后就要置零
          }
          l1 = l1->next;
          l2 = l2->next;//前进
      }
      if (r != 0)//防止最高位多出来一位
      {
          ans->next = new ListNode(0);//新开内存
          ans = ans->next;
          ans->val = r;
      }
      return l3->next;//注意最初的节点是没有用的,返回值类型要求为指针
    }
    int read(ListNode *l)//read函数,读取链表的长度
    {
        int len = 1;//注意这里从一开始
        while (l->next != NULL)//链表的尽头的判断
        {
            l = l->next;//下一节
            len++;//长度加一
        }
        return len;//返回长度
    }
    void put_zero(ListNode *l, int slen, int llen)//置零函数,用来使链表对齐
    {
        ListNode *p = l;//slen = smaller lenth较小长度,llen = long lenth较大长度
        for (int i = 1; i < llen; i++)//注意什么时候开始什么时候结束
        {
            if (i < slen)
            {
                p = p->next;//这里走到最后的一个
            }
            else
            {
                p->next = new ListNode(0);//这里没有了,要新开
                p = p->next;
                p->val = 0;//这个可以不要
            }
        }
    }
};

注意事项:

1、这里最多有一百位的数,即使是unsighned long long也没有办法存下来,所以只能逐位相加,类似于高精度加法。

2、注意,空指针的错误,一定要先分配内存再用,否则会很痛苦。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值