题目链接:两数相加

分析:

在两数相加的过程中,存在下面三种情况:

1. A的位上有数字,B的位上也有数字

那么相加后的和的该位上的数值应该是A的该位上对应的数字加上B的该位上对应的数字再加上前面的进位val

该位上的数字,应该是上面的得到的和对10取余,例如和为15,那么该位上的数字应该是5

进位也应该是一个和除10 的操作,例如和为15,进位就应该是1

2. A的位上有数字,B的位上没有数字

和应该是A上的数字加上前面的进位,该位上的数字也是和进行对10取余操作,进位也是和进行除10

3. A,B上均没有数字

那么看前面的仅为是否为1,如果是1创建一个值为1的节点就好

代码实现:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */

public class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        if (l1 == null)
            return l2;
        if (l2 == null)
            return l1;
        ListNode dummy = new ListNode(0);
        ListNode current = dummy;
        int carry = 0;
        while (l1 != null && l2 != null) {
            int dig = l1.val + l2.val + carry;
            int val = dig % 10;
            carry = dig / 10;
            ListNode newnode = new ListNode(val);
            current.next = newnode;
            current = current.next;
            l1 = l1.next;
            l2 = l2.next;
        }
        while (l1 != null) {
            int val = (l1.val + carry) % 10;
            carry = (l1.val + carry) / 10;
            current.next = new ListNode(val);
            current = current.next;
            l1 = l1.next;
        }
        while (l2 != null) {
            int val = (l2.val + carry) % 10;
            carry = (l2.val + carry) / 10;
            current.next = new ListNode(val);
            current = current.next;
            l2 = l2.next;
        }
        if (carry != 0)
            current.next = new ListNode(carry);
        return dummy.next;
    }
}

第二种解法:

public class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode prev = new ListNode(0);
        ListNode head = prev;
        int carry = 0;
        while (l1 != null || l2 != null || carry != 0) {
            ListNode cur = new ListNode(0);
            int sum = ((l2 == null) ? 0 : l2.val) + ((l1 == null) ? 0 : l1.val) + carry;
            cur.val = sum % 10;
            carry = sum / 10;
            prev.next = cur;
            prev = cur;
            l1 = (l1 == null) ? l1 : l1.next;
            l2 = (l2 == null) ? l2 : l2.next;
        }
        return head.next;
    }
}