遇到这题的时候我是很方的,天知道我做了多少次……

由于我也有做过一些题目,想着肯定一次遍历解决,不会再遍历两次啥的(而且也没必要)。

空间上,也想着要不直接用一条链表直接加另一条链表的值。虽然这个可行,但我当时根本没想很多,就直接干,没有考虑null这种情况,也简单以为链表是等长的,反正都是最基础的情况。
更更更难搞的是,我没有处理好进位的事情,我知道要设置一位来表示,但就是……(这与前面的null处理有关系,若是null则值为0

这个代码就是把l1和l2都遍历完,如果是空则值为0,否则就是正常的值相加。
同时有一个进位,结点的值相当于是l1.val+l2.val+carry三个相加,carry每轮都更新。
最后如果carry还是1,则再创建一个新结点连在后面。

其实最初也有想过一种,把链表的值转换成基本数据类型,但想想,无论是什么类型,他都会给你搞个溢出……

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) { 
        ListNode sentinel = new ListNode(0);
        ListNode cur = sentinel;
        int carry = 0;
        // 把l1和l2都遍历完
        while(l1 != null || l2 != null){
            // val为它们的值,若为空,则是0
            int val1 = l1 == null ? 0 : l1.val;
            int val2 = l2 == null ? 0 : l2.val;
            // 总和,总是进位与两链表的结点值相加
            int sum = val1 + val2 + carry;
            carry = sum / 10;
            // 新建结点
            ListNode node = new ListNode(sum % 10);
            cur.next = node;
            cur = node;
            if(l1 != null){
                l1 = l1.next;
            }
            if(l2 != null){
                l2 = l2.next;
            }
        }
        // 若最后还有进位,则再新建一个结点
        if(carry == 1){
            ListNode node = new ListNode(1);
            cur.next = node;
        }
        return sentinel.next;
    }
}