码迷,mamicode.com
首页 > 其他好文 > 详细

2. Add Two Numbers

时间:2019-09-11 09:34:05      阅读:66      评论:0      收藏:0      [点我收藏+]

标签:指针   http   pow   分解   new   etc   res   tno   cto   

  • 题目描述:
    技术图片

  • 题目思路:

这道题目比较简单,一开始我的思路是把两个链表里存储的数变成int类型,然后两个int类型相加,在把加和sum分解成个位,十位,百位,然后把分解之后的数据再插入到链表中即可,所以一开始的代码是这样的:

ListNode* createListNode(int val, struct ListNode* link)
{
//  struct ListNode* tp = (struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode* tp = new ListNode(val);
    tp->next = link;
    return tp;
}

class Solution 
{
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) 
    {
        int add1 = 0;
        int add2 = 0;
        int i = 0;
        int numresult = 0;
        vector<int> output;
        ListNode* result = NULL;
        if ((l1->val == 0) && (l2->val == 0))
        {
            result = createListNode(0,NULL);
            return result;
        }
        while (1)
        {
            add1 = add1 + l1->val * pow(10,i);
            l1 = l1->next;
            i = i + 1;
            if (l1 == NULL)
            {
                break;
            }
        }
        i = 0;
        while (1)
        {
            add2 = add2 + l2->val * pow(10, i);
            l2 = l2->next;
            i = i + 1;
            if (l2 == NULL)
            {
                break;
            }
        }
        numresult = add1 + add2;
        i = 0;

        while (numresult)
        {
            output.push_back(numresult % 10);
            numresult = numresult / 10;
        }

        result = createListNode(output[output.size() - 1], NULL);

        for (i = output.size() - 2;i >= 0;i--)
        {
            result = createListNode(output[i], result);
        }

        return result;
    }
};

提交之后发现,LeetCode的测试数据是
技术图片
这样的话,不论是用int类型还是long类型,都是不可能存储这么长的数据,看来这个题目我一开始的思路就不正确。

  • 第二次的思路
    在参考了网上的资料之后,将代码修改为如下:
    先声明一个头指针,因为对链表操作唯一的接口就是头指针,然后再声明一个指针cur,这是常用的一种手段,cur指向当前的节点。然后将l1和l2中的val相加,然后申请新的节点,把相加之后的结果(sum % 10)存放到新节点中,此时如果需要进位,将进位标志carry设置为(sum / 10),在结束整个循环之后,如果还需要进位,就再申请新的节点。
class Solution 
{
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) 
    {
        ListNode* frist = new ListNode(0);
        ListNode* cur = frist;
        int carry = 0;  //保存低位向高位的进位
        int sum = 0;
        while (l1 || l2)
        {
            int add1 = (l1 ? l1->val : 0);
            int add2 = (l2 ? l2->val : 0);
            sum = add1 + add2 + carry;
            cur->next = new ListNode(sum % 10);
            carry = sum / 10;
            cur = cur->next;
            if (l1)
            {
                l1 = l1->next;
            }
            if (l2)
            {
                l2 = l2->next;
            }
        }
        if (carry)
        {
            cur->next = new ListNode(1);
        }
        return frist->next;
    }
    
};

2. Add Two Numbers

标签:指针   http   pow   分解   new   etc   res   tno   cto   

原文地址:https://www.cnblogs.com/Manual-Linux/p/11482198.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!