给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 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;
}