LeetCode-2

2019/03/31

一开始的想法是简单的把这两个数表示出来然后相加,再将各个位填入链表中,代码如下:

时间复杂度O(max(m, n)),空间复杂度O(max(m, n))

ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    //得到链表L1代表的整数
    long long multiply = 1;
    long long addL = 0;    //L1链表所表示的整数
    ListNode* pWorkNode = l1;
    while (pWorkNode)
    {
        addL += multiply * pWorkNode->val;    //将各位数组成和整数
        multiply *= 10;
        pWorkNode = pWorkNode->next;
    }
        
    //将链表L2所代表整数与L1中的相加
    multiply = 1;
    pWorkNode = l2;
    while (pWorkNode)
    {
        addL += multiply * pWorkNode->val;
        multiply *= 10;
        pWorkNode = pWorkNode->next;
    }
        
    //所得整数按位数存入链表
    multiply = 10;
    long result = addL;
    ListNode* L3 = nullptr;
    ListNode* pTialNode = nullptr;
    while(result)
    {
        ListNode* pNewNode = new ListNode(result % multiply);
        result /= multiply;
            
        if (!L3)    //创建第一个结点
        {
            L3 = pNewNode;
            L3->next = nullptr;
            pTialNode = pNewNode;
        }
        else
        {
            pTialNode->next = pNewNode;
            pTialNode = pNewNode;
        }
        pTialNode->next = nullptr;
    }
        
    return L3;
}

执行结果是失败的,当有链表较长时,基本数据类型会溢出。之所以会这样想,感觉自己思考的时候没有条理性,不清晰。下次分析的时候一定要吸取教训,这样做是没什么效果的。

 

方法二:

时间复杂度O(max(m, n)),空间复杂度O(max(m, n))

ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    ListNode* pWorkNodeL1 = l1;
    ListNode* pWorkNodeL2 = l2;
    int valL1, valL2, num, carry = 0;    //从左到右分别是L1/L2对应位中的数值、L3当前结点的数值、进位
    ListNode* L3 = new ListNode(0);    //创建头结点
    ListNode* pTialNode = L3;
        
    while (pWorkNodeL1 || pWorkNodeL2 || carry)    //如果两个链表都到末尾则结束
    {
        if (!pWorkNodeL1)
            valL1 = 0;
        else
        {
            valL1 = pWorkNodeL1->val;
            pWorkNodeL1 = pWorkNodeL1->next;
        }
            
        if (!pWorkNodeL2)
            valL2 = 0;
        else
        {
            valL2 = pWorkNodeL2->val;
            pWorkNodeL2 = pWorkNodeL2->next;
        }
            
        num = (valL1 + valL2 + carry) % 10;
        ListNode* pNewNode = new ListNode(num);
        carry = (valL1 + valL2 + carry) / 10;
        pTialNode->next = pNewNode;
        pTialNode = pNewNode;
        pTialNode->next = nullptr;
    }
        
    return L3->next;
}

执行效果如下:

posted @ 2019-03-31 23:23  zpchya  阅读(100)  评论(0编辑  收藏  举报