Leetcode Algorithm 002. Add Two Numbers

Leetcode Algorithm 002. Add Two Numbers

Add Two Numbers
用两个非空的链表表示两个非负整数,数字在链表中是逆向排列的,求这两个整数的和,并且用这样的链表表示出来。(整数中没有如“001”之类的前导0。)

解题思路

首先分析一下链表如何表示一个整数,下面结合题中的样例说明。

342:243NULL

465:564NULL

那么,逆序整数数位链表的加法便可以等同于从整数低位开始相加,也就是我们小学所学到的两个整数的竖式笔算规则:

  • 从个位开始,同位相加
  • 满十进一,写和的个位数

在程序中,我们首先需要注意以下几个方面

  1. 链表的操作:遍历,节点的创建,链表节点的连接;
  2. 实现“满十进一”的规则,需要保留进位,以供下一位的加法所用;
  3. 某个链表若已遍历结束,则只需遍历完另外一个链表即可;
  4. 两个链表若都遍历结束,最后如果有进位,则要创建一个新的节点,存进结果链表中。

代码与测试样例

#include <iostream>
#include <vector>

using namespace std;

struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};

ListNode* buildList(int array[], int number) {
    ListNode* list = new ListNode(array[0]);

    for (int i = 1; i < number; i++) {
        ListNode* p = new ListNode(array[i]);
        p->next = list;
        list = p;
    }

    return list;
}

void printList(ListNode* list) {
    ListNode* p = list;

    while (p != NULL) {
        cout << p->val << "->";
        p = p->next;
    }
    cout << "NULL" << endl;
}

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode* p1 = l1;
        ListNode* p2 = l2;

        int node_sum = p1->val + p2->val;
        int node_val = node_sum % 10;

        node_sum = node_sum / 10;

        ListNode* result = new ListNode(node_val);
        ListNode* p_result = result;

        p1 = p1->next;
        p2 = p2->next;

        while (p1 != NULL || p2 != NULL){
            if (p1 != NULL){
                node_sum += p1->val;
                p1 = p1->next;
            }

            if (p2 != NULL){
                node_sum += p2->val;
                p2 = p2->next;
            }

            node_val = node_sum % 10;
            node_sum = node_sum / 10;

            p_result->next = new ListNode(node_val);
            p_result = p_result->next;
        }

        if (node_sum !=0){
            p_result->next = new ListNode(node_sum);
        }

        return result;
    }
};

int main() {
    // 342 + 465 = 807
    int a1[] = { 3, 4, 2 };
    int a2[] = { 4, 6, 5 };

    int m = 3, n = 3;

    ListNode* l1 = buildList(a1, m);
    ListNode* l2 = buildList(a2, n);

    Solution s;

    ListNode* result = s.addTwoNumbers(l1, l2);

    printList(l1);
    printList(l2);
    printList(result);

    return 0;
}

输出

2->4->3->NULL
5->6->4->NULL
7->0->8->NULL

知识点

总结一下链表的使用技巧,大家可以在链表创建的过程中体会链表的节点是如何连接的。

链表的创建

// 从链表头创建
ListNode* buildListFromHead(int array[], int number) {
    ListNode* list = new ListNode(array[0]);

    for (int i = 1; i < number; i++) {
        list->next = new ListNode(array[i]);
        list = list->next;
    }

    return list;
}

// 从链表尾创建
ListNode* buildListFromTail(int array[], int number) {
    ListNode* list = new ListNode(array[0]);

    for (int i = 1; i < number; i++) {
        ListNode* p = new ListNode(array[i]);
        p->next = list;
        list = p;
    }

    return list;
}

链表的遍历

void printList(ListNode* list) {
    ListNode* p = list;

    while (p != NULL) {
        cout << p->val << "->";
        p = p->next;
    }
    cout << "NULL" << endl;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值