LeetCode445---两数相加 II

题目描述

给定两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。

 

你可以假设除了数字 0 之外,这两个数字都不会以零开头。

进阶:

如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。

示例:

输入: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
输出: 7 -> 8 -> 0 -> 7

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

  这一题比较简单,注意处理好边界条件就行了。因为链表都非空,所以不用特殊处理,先得到两条链的长度len1和len2以及差值dis,用一个栈来暂存相加的结果。让较长的链先进去dis个,然后再让两个链对应位置值相加放进去,前面长链进了dis位,此时正好对应上。当我们加完后,就得到了一个未进位的加法结果。然后慢慢出栈,并判断这里是否已经进位,进位的需要额外计算进位后的结果。出栈后的结果使用头插法生成新链,然后返回最后的节点。

ShowCode

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        //先计算两者长度,然后谁长谁先进栈。到了同位的时候就一起进栈。进完后一个个出栈,用头插法生成新的链表
        int len1 = 0,len2 = 0;
        int maxL,dis,minL;
        vector<int> res;
        ListNode*p = l1,*q = l2;
        while(p)
        {
            ++len1;
            p = p->next;
        }
        while(q)
        {
            ++len2;
            q = q->next;
        }
        if(len1 > len2)
        {
            p = l1;
            q = l2;
        }
        else
        {
            p = l2;
            q = l1;
        }
        maxL = len1>len2?len1:len2;
        minL = len1>len2?len2:len1;
        dis = maxL - minL;
        //拿到了两者的长度l1和l2,较长的为maxL,且先移动maxL-min(l1,l2)位
        for(int i = 0;i < dis;++i)
        {
            res.push_back(p->val);
            p = p->next;
        }
        for(int i = 0;i < minL;++i)//相加再进栈
        {
            res.push_back(p->val+q->val);
            p = p->next;
            q = q->next;
        }
        //全部都放进去了,再根据这个vector来还原
        p = NULL;
        while(!res.empty())
        {
            int num = res[res.size()-1];
            res.pop_back();
            cout<<num<<endl;
            if(num > 9)
            {
                if(!res.empty())
                {
                    num -= 10;
                    res[res.size()-1] += 1;   
                }
                else
                {
                    num = num - 10;
                    res.push_back(1);//最后的挣扎;进位
                }
            }
            q = new ListNode(num);
            //新节点是这个,让这个新节点指向前一个节点,并更新前一个节点
            q->next = p;
            p = q;
        }
        return p;
    }
};

猜你喜欢

转载自blog.csdn.net/l1606468155/article/details/98936805