【详细整理】2. 两数相加

218 阅读1分钟

题目

leetcode-cn.com/problems/ad…

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

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

思路

这题一拿到手其实有俩思考点:

1、逆序,需不需要反转

自己动手写了一个例子突然发现想左了,逆序刚好不需要发转,因为链表读取刚好从头开始,加法也是从末位开始,所以逆序相当于加法顺序是正的。要是顺序才需要反转

2、进位

定义一个参数cur来储存进位

代码

代码有几个注意会写错忽略的点,在注释里面标出来了。

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        // 边界条件
        if (l1 == null){
            return l2;
        }
        if (l2 == null){
            return l1;
        }
        int cur=0,i=0,j=0,sum=0;
        ListNode l3 = new ListNode(0);
        ListNode a = l1,b=l2,c=l3;
        
        // 这里循环终止条件要注意,要记得还有一个进位,然后位数可能不等,中间是或
        // while(a != null || b != null){
        while(a != null || b != null || cur != 0){
            // 要考虑到a/b是null的情况
            // i = a.val;
            // j = b.val;
            i = a == null ? 0 : a.val;
            j = b == null ? 0 : b.val;
            sum = i + j + cur;
            // 和大于9则进1
            cur = sum > 9 ? 1 : 0;
            // 取个位:sum%10, 10的i次方:Math.pow(10,i)
            ListNode k = new ListNode(sum%10);
            c.next = k;
            // 注意用到next要有null判断
            if(a != null){
                a = a.next;
            }
            if(b != null){
                b = b.next;
            }
            
            c = c.next;
        }
        return l3.next;

    }
}