LeetCode题解 #2 Add Two Numbers

题目大意:使用链表表示的两个整数,计算出其和,以同样的形式返回

考察点:指针,链表

题目描述

You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)

Output: 7 -> 0 -> 8

算法描述

本题实质是一个模拟笔算加法的过程,其考察点有两个:一是链表的使用,二是对于加法运算的理解。

其需要注意的问题主要为:

给定的两个加数位数不同
进位的处理
对于两个加数位数不同,有2种处理方法:一是首先遍历两个加数,将位数不够的加数前补0。对于同样长度的代码,我们就可以直接对位相加。其代码如下:

ListNode *p1 = l1, *p2 = l2;
while (p1 || p2) {
    if (p1) p1 = p1 -> next;
    else p1 -> next = new ListNode(0), p1 = p1 -> next;

    if (p2) p2 = p2 -> next;
    else p2 -> next = new ListNode(0), p2 = p2 -> next;
}    // 此时l1和l2链表长度已经相同
p1 = l1, p2 = l2;
ListNode *ansHead, *p = NULL;
while (p1 || p2) {
    int tp = (p1 -> val) + (p2 -> val);
    if (p == NULL) p = new ListNode(tp), ansHead = p;
    else p -> next = new ListNode(tp), p = p -> next;
    p1 = p1 -> next, p2 = p2 -> next;
}    // 在这个循环中,我们没有处理进位

第二种方法,在计算时我们发现一个链表已经为空时,就将对应位置的值默认为0,其代码如下:

p1 = l1, p2 = l2;
ListNode *ansHead, *p = NULL;
while (p1 || p2) {
    int tp = 0;

    if (p1 != NULL) tp += p1 -> val;
    else tp += 0;    // 该行语句可以去掉

    if (p2 != NULL) tp += p2 -> val;
    else tp += 0;    // 该行语句可以去掉

    if (p == NULL) p = new ListNode(tp), ansHead = p;
    else p -> next = new ListNode(tp), p = p -> next;

    if (p1 != NULL) p1 = p1 -> next;
    if (p2 != NULL) p2 = p2 -> next;
}    // 在这个循环中,我们没有处理进位
接下来对已经计算出的链表ansHead进行进位处理:

ListNode *p = ansHead;
while (p) {
    if (p -> val >= 10) {
        if (p -> next)     // 该if语句很重要,主要用于处理最高位的进位
            p -> next -> val += (p -> val) / 10;
        else p -> next = new ListNode((p -> val) / 10);    // 最高位的进位
        p -> val %= 10;
    }
    p = p -> next;
}

当然在第一部对位相加时,同样可以将进位考虑进去,具体的实现可以参考下面的代码:

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode *ansHead = NULL, *p = NULL;
        int carry = 0;
        while (l1 || l2 || carry) {
            int tp = 0;
            if (l1) tp += l1 -> val;
            if (l2) tp += l2 -> val;
            if (carry) tp += carry;

            if (l1) l1 = l1 -> next;
            if (l2) l2 = l2 -> next;
            if (tp >= 10) carry = 1, tp %= 10;
            else carry = 0;

            if (p == NULL) p = new ListNode(tp), ansHead = p;
            else p -> next = new ListNode(tp), p = p -> next;
        }
        return ansHead;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值