【Leetcode】2. Add Two Numbers

题目描述

You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order, and each of their nodes contains a single digit. Add the two numbers and return the sum as a linked list.

You may assume the two numbers do not contain any leading zero, except the number 0 itself.

給定兩個非空鏈表,表示兩個非負整數。數位以相反的順序存儲,每個節點包含一個數字。將兩個數字相加並將其作為鏈表返回。

您可以假設這兩個數字都不包含任何前導0,除了數字0本身。

举例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XKdgjSg3-1690019192464)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/d1b2dfd4-ad07-428a-ac7b-3cbba1168cdb/Untitled.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LtQi6C2J-1690019192466)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/ff30068d-b3a1-4256-b6be-19d77a8ddd0a/Untitled.png)]

分析

我的思路和代码

基本思路:l2加到l1上输出l1

1) 首先,定义两个指针p1,p2分别指向l1和l2的头结点;

2) 设 m = m i n { l e n ( l 1 ) , l e n ( l 2 ) } m=min\{len(l1), len(l2)\} m=min{len(l1),len(l2)},对于前 m-1 个节点,将l2的值对应得加到l1上,如果和大于10,取模并为l1下一个节点—的值增1。

3) 把l2的尾部值加到l1的尾部值上;把l2比l1长的部分(如果l2更长的话)添加到l1尾的后面。

4)从l1原来的尾节点开始遍历剩下的节点,如果值>10,取模给后一个节点值+1

5)如果最后一个节点的值>10,手动添加一个值为1的节点。

代码

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        // ListNode* res = new ListNode(0);
        ListNode* p1 = l1;
        ListNode* p2 = l2;

        //l2 加到l1上
        while(p1->next != NULL && p2->next != NULL){
            //到倒数第二个节点
            int tsum = p1->val + p2->val;
            if(tsum >= 10)
                p1->next->val +=1;
            p1->val = tsum % 10;
            p1 = p1->next;
            p2 = p2->next;
        }

        if(p1->next == NULL)
            p1->next = p2->next;
        p1->val += p2->val;
        while(p1 != NULL){
            if(p1->val >= 10){
                p1->val %= 10;
                if(p1->next == NULL){
                    ListNode *newlast = new ListNode(1, NULL);
                    p1->next = newlast;
                }
                else
                    p1->next->val += 1;
            }
            p1 = p1->next;
        }
        return l1;
    }
};

比较好的方法

思路

设置一个虚拟头节点,这样做代码也简洁多了!

1)新建初始节点dummy 值为0,指针curr指向它;int carry 暂时存放和;l1,l2是可以移动的指针

2)carry 初值=0, 如果指针l1,l2非空,将它们所指的节点值加到carry上。

3)结果链表新增一个节点,值为carry % 10, 更新carry = carry /10,这样下一轮可以加上进位。

4)只要l1, l2还没完,或者carry不等于0,重复2)3)

5)返回结果。

代码

class Solution {
 public:
  ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    ListNode dummy(0);
    ListNode* curr = &dummy;
    int carry = 0;

    while (l1 || l2 || carry) {
      if (l1 != nullptr) {
        carry += l1->val;
        l1 = l1->next;
      }
      if (l2 != nullptr) {
        carry += l2->val;
        l2 = l2->next;
      }
      curr->next = new ListNode(carry % 10);
      carry /= 10;
      curr = curr->next;
    }

    return dummy.next;
  }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值