力扣算法题——两数相加练习

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers

------------------------------------分割线----------------------------------------------------------------------

1、第一次做这道题的时候,开始有点懵,后来查阅了下链表相关的知识有了一个初步思路,现将链表存储的数值取出,转成整型,然后进行加和,再将加和的结果转换保存成链表。但实际实现过程中,发现这个方法行不通,当整型数值长度超长(超出int64最大长度)时,程序编程报错,所以这个放弃了这个思路。

2、第二次尝试转换了思路,分析了链表的格式,链表头部存储的是整型数值最小的位数,所以采用遍历链表的方法,逐个取出链上的值进行加和,加和的结果与10对比,如果大于10,则记录数值进一位,直到链表没有后续连接为止。这里有一个出错点,就是当链表最后一次加和处理完后的结果如果大于10,需要再添加一个连接保存上位值,这个也是我做的过程中没考虑到的问题,导致提交失败。代码如下:

public ListNode AddTwoNumbers(ListNode l1, ListNode l2) {
      int _newAdd = 0;
            ListNode _headNode = new ListNode(0);
            ListNode _dealingNode=null;
          
            int _nextVal = 0;
            while (l1!= null || l2 != null)
            {
                int val1 = 0;
                int val2 = 0;
                ListNode _node = new ListNode(0);
                if (l1 != null) { val1 = l1.val; }
                if (l2 != null) { val2 = l2.val; }

                _nextVal = val1 + val2 + _newAdd;
                _newAdd = 0;
                if (_nextVal >= 10)
                {
                    _nextVal -= 10;
                    _newAdd = 1;
                }
                _node.val = _nextVal;

                if (_dealingNode == null) {
                    _headNode = _node;
                    _dealingNode = _headNode;
                }
                else {
                    _dealingNode.next = _node;
                    _dealingNode = _node;
                }
                if (l1 != null) { if (l1.next != null) { l1 = l1.next; } else { l1 = null; } }
                if (l2 != null) { if (l2.next != null) { l2 = l2.next; } else { l2 = null; } }
                
            }

            //额外判断一次
            if (_newAdd > 0)
            {
                ListNode _node = new ListNode(1);
                _dealingNode.next = _node;
            }
            return _headNode;
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值