题目

原链接: https://leetcode.cn/problems/add-two-numbers/
给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0开头。
image.png

  1. 示例 1
  2. 输入:l1 = [2,4,3], l2 = [5,6,4]
  3. 输出:[7,0,8]
  4. 解释:342 + 465 = 807.
  5. 输入:l1 = [0], l2 = [0]
  6. 输出:[0]
  7. 示例 3
  8. 输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
  9. 输出:[8,9,9,9,0,0,0,1]

概述:两个链表, 对应的位置进行相加, 满10则进位, 即下一对数值相加时, 加上进位值
a = [2,4,3], b = [5,6,4]
2+5 =7
4+6 = 10 保存0 向下一组进1
3+4+1(进位值)=8
结果: 708

思路: 链表位数可能不同, 可以假设空的位置为0, 这样就可以进行相加; 注意最后多出的余数,没有相加组了,要补上元素

解法

  1. class ListNode {
  2. int val;
  3. ListNode next;
  4. ListNode() {
  5. }
  6. ListNode(int val) {
  7. this.val = val;
  8. }
  9. ListNode(int val, ListNode next) {
  10. this.val = val;
  11. this.next = next;
  12. }
  13. @Override
  14. public String toString() {
  15. return "ListNode{" +
  16. "val=" + val +
  17. ", next=" + next +
  18. '}';
  19. }
  20. }
@Test
public void test() {
    ListNode listNode1 = new ListNode(2, new ListNode(4, new ListNode(3)));
    ListNode listNode2 = new ListNode(5, new ListNode(6, new ListNode(7)));
    System.out.println(addTwoNumbers(listNode1, listNode2));
}

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    System.out.println(l1);
    System.out.println(l2);

    ListNode resultNode = null;
    ListNode currentNode = new ListNode();

    int carry = 0;
    while (l1 != null || l2 != null) {
        // 长度不够 当成0
        if (l1 == null) {
            l1 = new ListNode(0);
        }
        if (l2 == null) {
            l2 = new ListNode(0);
        }

        // 相加
        int number = l1.val + l2.val + carry;
        System.out.println(l1.val + " " + l2.val + "进位:" + carry);

        // 进位数
        carry = number / 10;

        // 当前位置的数值  取余数
        int remainder = number % 10;
        if (resultNode == null) {
            resultNode = new ListNode(remainder);
            currentNode = resultNode;
        } else {
            currentNode.next = new ListNode(remainder);
            currentNode = currentNode.next;
        }

        l1 = l1.next;
        l2 = l2.next;
    }
    if (carry > 0) {
        currentNode.next = new ListNode(carry);
    }
    return resultNode;
}