LintCode-[中等] 221. 链表求和 II

描述
假定用一个链表表示两个数,其中每个节点仅包含一个数字。假设这两个数的数字顺序排列,请设计一种方法将两个数相加,并将其结果表现为链表的形式。

样例

给出 6->1->7 + 2->9->5。即,617 + 295。

返回 9->1->2。即,912 。

思路
先分别遍历两个链表,将两个链表中的数一个一个储存到整型数组中,对比两个链表的长度,即链表所代表的数的位数,如果不同则将位数小的那个数往所在数组的后面移动直到两个数的个位对齐,然后进行加法运算,并注意加法结束后最高位是否进1。最后在把运算结果从数组中提取出来连接成链表。

C++实现

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution
{
public:
    /**
    * @param l1: the first list
    * @param l2: the second list
    * @return: the sum list of l1 and l2
    */
    ListNode *creatList(ListNode* pre, int val) {
        ListNode *newNode = new ListNode(val);
        pre->next = newNode;
        return newNode;
    }

    ListNode *addLists2(ListNode *l1, ListNode *l2) {
        // write your code here
        if (l1 == NULL && l2 != NULL) return l2;
        if (l1 != NULL && l2 == NULL) return l1;
        if (l1 == NULL && l2 == NULL) return NULL;
        int size1 = 1;
        int size2 = 1;
        int resultSize = 0;
        ListNode *cur1 = l1;
        ListNode *cur2 = l2;
        int num1[300] = { 0 };
        int num2[300] = { 0 };
        int result[300] = { 0 };
        memset(num1, 0, 300);
        memset(num2, 0, 300);
        memset(result, 0, 300);
        if (cur1->next == NULL) {
            num1[0] = cur1->val;
        }
        if (cur2->next == NULL) {
            num2[0] = cur2->val;
        }
        while (cur1->next != NULL) {
            num1[size1 - 1] = cur1->val;
            size1++;
            cur1 = cur1->next;
            if (cur1->next == NULL) {
                num1[size1 - 1] = cur1->val;
            }
        }
        while (cur2->next != NULL) {
            num2[size2 - 1] = cur2->val;
            size2++;
            cur2 = cur2->next;
            if (cur2->next == NULL) {
                num2[size2 - 1] = cur2->val;
            }
        }
        cur1 = l1;
        cur2 = l2;
        if (size1 > size2) {
            for (int i = 1; i <= size2; i++) {
                num2[size1 - i] = num2[size2 - i];
                num2[size2 - i] = 0;
            }
            int c = 0;
            resultSize = size1 + 1;
            for (int i = size1; i > 0; i--) {
                result[i] = (c + (num1[i - 1] + num2[i - 1])) % 10;
                if (c + num1[i - 1] + num2[i - 1] >= 10) c = 1;
                else c = 0;
                result[0] = c;
            }
        }
        else if (size1 < size2) {
            for (int i = 1; i <= size1; i++) {
                num1[size2 - i] = num1[size1 - i];
                num1[size1 - i] = 0;
            }
            int c = 0;
            resultSize = size2 + 1;
            for (int i = size2; i > 0; i--) {
                result[i] = (c + (num1[i - 1] + num2[i - 1])) % 10;
                if (c + num1[i - 1] + num2[i - 1] >= 10) c = 1;
                else c = 0;
                result[0] = c;
            }
        }
        else if (size1 == size2) {
            int c = 0;
            resultSize = size2 + 1;
            for (int i = size2; i > 0; i--) {
                result[i] = c + (num1[i - 1] + num2[i - 1]) % 10;
                if (c + num1[i - 1] + num2[i - 1] >= 10) c = 1;
                else c = 0;
                result[0] = c;
            }
        }
        if (result[0] == 0) {
            ListNode *head = new ListNode(result[1]);
            ListNode *curR = head;
            for (int i = 2; i < resultSize; i++) {
                ListNode *acurR = creatList(curR, result[i]);
                curR = acurR;
                }
            }
            return head;
        }
        else if (result[0] == 1) {
            ListNode *head = new ListNode(result[0]);
            ListNode *curR = head;
            for (int i = 1; i < resultSize; i++) {
                ListNode *acurR = creatList(curR, result[i]);
                curR = acurR;
                }
            }
            return head;
        }
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值