445. Add Two Numbers II

来源:互联网 发布:linux mysql删除数据库 编辑:程序博客网 时间:2024/05/16 00:52

445. Add Two Numbers II

You are given two linked lists representing two non-negative numbers. The most significant digit comes first and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

You may assume the two numbers do not contain any leading zero, except the number 0 itself.

Follow up:
What if you cannot modify the input lists? In other words, reversing the lists is not allowed.

Example:

Input: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)Output: 7 -> 8 -> 0 -> 7

思路:用一个数组vector<ListNode*>pre,存储可能会因为进位val有改变的节点。首先定义一个伪节点p(0)来存储最后的结果,当然,pre中初始时就一个p。下面考虑从高位到低位加的时候,怎么进位。如果当前位的和小于9,它肯定不会进位,则将当前pre清空,只存入当前的节点。如果当前位和恰好为9,它可能会因为下一位的进位对当前位的更高位产生影响,因此因加入pre。我们可以想象,一般pre只有一个元素,当pre内有多个元素时,除了它的第一位不是9,其他位必定都是9,这是针对可能出现连续进位的情形。当前位的和大于9,即产生进位时,pre里所有在当前位之前的位就开始+1,在对10取余,然后pre里的数再次清空,压入当前位的val。

/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {    int len(ListNode* l)    {        int cnt=0;        while(l)        {            cnt++;            l=l->next;        }        return cnt;    }public:    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {        if(l1->val==0&&!l1->next) return l2;        if(l2->val==0&&!l2->next) return l1;        if(len(l1)<len(l2)) return addTwoNumbers(l2,  l1);        int n1=len(l1),n2=len(l2);        int diff=n1-n2;        int i=0;        ListNode* p=new ListNode(0);        ListNode* r=p;        vector<ListNode*> pre;        pre.push_back(p);        while(i<diff)        {            ListNode* t=new ListNode(l1->val);            p->next=t;            l1=l1->next;            p=p->next;            if(t->val<9)            pre.clear();            pre.push_back(t);             i++;        }        while(i<n1)        {            int v=l1->val+l2->val;            ListNode* t=new ListNode(v%10);              p->next=t;            if(v>9)            {                for(auto it:pre)                (it->val)=(it->val+1)%10;                pre.clear();                pre.push_back(t);            }else if(v==9)            pre.push_back(t);            else            {                pre.clear();                pre.push_back(t);            }            l1=l1->next;            l2=l2->next;            p=p->next;             i++;        }                if(r->val!=0) return r;        else return r->next;    }};



0 0
原创粉丝点击