题目:

2. 两数相加

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

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

您可以假设除了数字 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;
    }
}

public class code2 {

    public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode dummyHead = new ListNode(0);
        ListNode p = l1, q = l2, curr = dummyHead;
        int carry = 0;
        while (p != null || q != null) {
            int x, y;
            if (p != null) {
                x = p.val;
            } else {
                x = 0;
            }
            if (q != null) {
                y = q.val;
            } else {
                y = 0;
            }
            int sum = carry + x + y;
            carry = sum / 10;
            curr.next = new ListNode(sum % 10);
            curr = curr.next;
            if (p != null) {
                p = p.next;
            }
            if (q != null) {
                q = q.next;
            }
        }

        if (carry == 1) {
            curr.next = new ListNode(1);
        }
        return dummyHead.next;
    }

    public static void main(String[] args) {
        // eg1
        ListNode num1 = new ListNode(2);
        num1.next = new ListNode(4);
        num1.next.next = new ListNode(3);

        ListNode num2 = new ListNode(5);
        num2.next = new ListNode(6);
        num2.next.next = new ListNode(4);

        ListNode result = addTwoNumbers(num1, num2);
        System.out.print(result.val + " -> " + result.next.val + " -> " + result.next.next.val);

        System.out.println();
        // eg2
        ListNode result1 = addTwoNumbers(new ListNode(5), new ListNode(5));
        System.out.print(result1.val + " -> " + result1.next.val);

        System.out.println();
        // eg3
        ListNode num3 = new ListNode(9);
        num3.next = new ListNode(9);

        ListNode num4 = new ListNode(1);

        ListNode result2 = addTwoNumbers(num3, num4);
        System.out.print(result2.val + " -> " + result2.next.val + " -> " + result2.next.next.val);

        System.out.println();
        // eg4
        ListNode num5 = new ListNode(0);
        num5.next = new ListNode(1);

        ListNode num6 = null;
        ListNode result3 = addTwoNumbers(num5, num6);
        System.out.print(result3.val + " -> " + result3.next.val);
    }
}

运行结果:

参考:

  1. 2. 两数相加——题解
  2. LeetCode - 两数相加
  3. 哑结点
  4. 链表头结点存在的意义