【LeetCode】2. Add Two Numbers

Add Two Numbers

题目描述

两个非空链表,表示两个非负整数。数字以相反的顺序存储,每个节点包含一个数字。将两个数字相加,返回一个新的链表。
假设除了数字 0 之外,这两个数都没有前导零。

Example:

Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
Explanation: 342 + 465 = 807

解题思路

这道题目算是非常经典的一道题目了,要点就是设置一个跟踪变量 ( carry ),来跟踪当前位数的数字之和是否需要进位。

一般情况下,都会设置一个新的链表头 ( dummyHead ) 来指向需要返回的链表,然后定义一个 curr 节点跟踪当前节点的位置。

参考代码

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode dummyHead = new ListNode(0); // 设置返回链表的头节点
        ListNode node1 = l1, node2 = l2, curr = dummyHead;
        int carry = 0;
        while (node1 != null || node2 != null) {
            int x = (node1 != null) ? node1.val : 0;
            int y = (node2 != null) ? node2.val : 0;
            int sum = carry + x + y;
            carry = sum / 10;
            curr.next = new ListNode(sum % 10);
            curr = curr.next;
            if (node1 != null) node1 = node1.next;
            if (node2 != null) node2 = node2.next;
        }
        if (carry > 0) {
            curr.next = new ListNode(carry);
        }
        return dummyHead.next;
    }

拓展

原题解最后说了这样的一句话:

What if the the digits in the linked list are stored in non-reversed order? For example:
( 3 → 4 → 2 ) + ( 4 → 6 → 5 ) = 8 → 0 → 7

如果链表中的数字以非反转顺序存储怎么办?

首先想到的就是反转链表:
先把 l1l2 反转,最后返回的时候,再把 dummyHead.next 反转。

参考代码(拓展)

    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
		// 链表反转
        l1 = reverseList(l1);
        l2 = reverseList(l2);
        ListNode dummyHead = new ListNode(0); // 设置返回链表的头节点
        ListNode node1 = l1, node2 = l2, curr = dummyHead;
        int carry = 0;
        while (node1 != null || node2 != null) {
            int x = (node1 != null) ? node1.val : 0;
            int y = (node2 != null) ? node2.val : 0;
            int sum = carry + x + y;
            carry = sum / 10;
            curr.next = new ListNode(sum % 10);
            curr = curr.next;
            if (node1 != null) node1 = node1.next;
            if (node2 != null) node2 = node2.next;
        }
        if (carry > 0) {
            curr.next = new ListNode(carry);
        }
        return reverseList(dummyHead.next);
    }

    private ListNode reverseList(ListNode head) {
        ListNode prev = null;
        ListNode curr = head;
        ListNode next;
        while (curr != null) {
            next = curr.next;
            curr.next = prev;
            prev = curr;
            curr = next;
        }
        return prev;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值