用java 实现 Add Two Numbers 两数相加(LeetCode算法)

LeetCode上的“Add Two Numbers”问题要求我们实现一个函数,该函数接收两个非空链表作为输入,每个链表表示一个非负整数的逆序表示(即个位在链表头),链表中的每个节点包含一个数字(0-9)。任务是将这两个数相加,并以同样的链表格式返回和。

下面是用Java实现这个算法的方法:

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

public class AddTwoNumbers {
    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) {
            // 获取当前节点值,如果已经遍历完其中一个链表,则用0代替
            int x = (p != null) ? p.val : 0;
            int y = (q != null) ? q.val : 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 > 0) {
            curr.next = new ListNode(carry);
        }

        // 返回新的链表头
        return dummyHead.next;
    }

    public static void main(String[] args) {
        // 示例调用
        // 创建第一个链表: 2 -> 4 -> 3
        ListNode l1 = new ListNode(2);
        l1.next = new ListNode(4);
        l1.next.next = new ListNode(3);

        // 创建第二个链表: 5 -> 6 -> 4
        ListNode l2 = new ListNode(5);
        l2.next = new ListNode(6);
        l2.next.next = new ListNode(4);

        // 调用 addTwoNumbers 方法
        ListNode result = addTwoNumbers(l1, l2);

        // 打印结果链表
        while (result != null) {
            System.out.print(result.val + " ");
            result = result.next;
        }
    }
}

在这个实现中,我们首先定义了一个ListNode类来表示链表的节点。然后实现了addTwoNumbers方法,它接受两个链表l1l2作为参数,创建了一个虚拟头结点dummyHead来简化代码逻辑,并使用了三个指针pqcurr分别指向链表l1l2和结果链表的当前位置。我们还定义了一个变量carry来跟踪进位。

接下来,我们遍历两个链表,对于每一对对应的节点,我们将它们的值相加,并加上前一次计算的进位。如果和大于等于10,则更新进位为1,并只保留个位数作为当前位的结果。最后,如果有剩余的进位,我们还需要创建一个新的节点来保存这个进位。

main方法中给出了一对链表的例子,展示了如何创建链表以及如何调用addTwoNumbers方法并打印结果。

你可能感兴趣的:(算法,java,leetcode)