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

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

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

示例:

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

  public class ListNode {
      int val;
      ListNode next;
     ListNode(int x) { val = x; }
  }
 

这个是题目给出的ListNode格式  由此看出是其输入输出是链表格式  所以要有标记点标记链表当前位置 和头结点记录链表的起始位置(单向链表)

下面是我自己写的代码(参考答案)

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode l3 = new ListNode(0);//头结点记录位置
        ListNode p =l1 , q= l2 , curr = l3;//curr是记录该链表当前位置 p q是l1,l2当前位置
        int yu = 0;//升位 当两数相加大于十要进位 这点一定不能忘掉
        while(p != null || q!=null){//判断两个是否为空 有一个不为空则要继续进行操作
            int x = (p != null) ? p.val :0;
            int y = (q!=null)?q.val:0;
            int sum = yu+x+y;
            yu = sum/10;
            curr.next = new ListNode(sum%10);
            curr = curr.next;//链表节点向前走
            if(p != null) p = p.next;//链表节点向前走
            if(q != null) q = q.next;//链表节点向前走
        }
        if(yu >0){
            curr.next = new ListNode(yu);//最后计算出来发现还有进位则要再往前加一位
        }
        return l3.next;//返回头结点记录
    }
}

看完我自己的我又去翻找了其他大神的 (再评论区发现有一个说是打败百分之九十九的31ms)

class Solution {//思路没有变 变换了写法 少去多个步骤吧
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
       LinkedList<Integer> linkedList = new LinkedList<>();
       //先创建一个List 将结果先保存到list中
        ListNode n1 = l1;
        ListNode n2 = l2;
        do{
            linkedList.push(n1.val + n2.val);//直接将结果保存  进位到最后统一处理
            n1 = n1.next;
            n2 = n2.next;
        }while  (n1 !=null && n2 !=null);

        if (n1!=null)
//如果其中一个链表结束了 就只需要判断其中一个链表就行 省去对象创建赋值过程
            do{
                linkedList.push(n1.val );
                n1 = n1.next;
            }while (n1 !=null);
        if (n2!=null)
//如果其中一个链表结束了 就只需要判断其中一个链表就行 省去对象创建赋值过程
            do{
                linkedList.push( n2.val);
                n2 = n2.next;
            }while (n2 !=null);


        boolean jinwei =false;//统一处理进位 前一位有进位就将其加一
//在这里有一个小细节就是 刚好这位加了进位为10 又进了一位 所以需要在进位之后判断该值
        for (int i = linkedList.size()-1; i >= 0; i--) {
            if (jinwei){
                linkedList.set(i,linkedList.get(i)+1);
            }
            if (linkedList.get(i)>9){
                linkedList.set(i,linkedList.get(i)-10);
                jinwei = true;
            }else{
                jinwei =false;
            }
        }
        if (jinwei){//一样  结束之后还有进位就要再基础上再加一位
            linkedList.push(1);
        }


        ListNode resNode = new ListNode(linkedList.pollLast());
        ListNode node =resNode;
        while (!linkedList.isEmpty()){//将list元素放到node中 将最后一位弹出
            node.next = new ListNode(linkedList.pollLast());
            node = node.next;
        }
        return resNode;
    }
}

然后提交通过时间

其实我提交代码就这两种,但是时间是不一样的 所以有时候用时高不一定是自己代码的原因 可以多试几次