[Leetcode] 2.Add Two Numbers(List To Long,模拟)

来源:互联网 发布:coach淘宝代购 编辑:程序博客网 时间:2024/06/16 22:24

本题题意是指将两个数倒序存储在链表中,再将两数之和同样存储在链表中输出。

我最开始的思路是将每一位相加,再考虑是否进位,但这时就需要考虑一些情况,比较麻烦。

于是我决定采取另一种在网上新学到的方法:这个方法就是将链表中的数字串起来,当做一个long,例如2->4->5,可以根据题目具体要求转化成long型的542,再做后续的操作,就很容易了。

 1 /** 2  * Definition for singly-linked list. 3  * struct ListNode { 4  *     int val; 5  *     ListNode *next; 6  *     ListNode(int x) : val(x), next(NULL) {} 7  * }; 8  */ 9 class Solution10 {11 public:12     long ListToLong(ListNode* l)13     {14         long res = 0;15         long tem = 1;16         while(l)17         {18             res = res + l->val * tem;19             tem = tem * 10;20             l = l->next;21         }22         return res;23     }24     long get_n(long num)25     {26         long x = 10;27         long n = 1;28         while(num >= x)29         {30             n ++;31             x = x * 10;32         }33         return n;34     }35     void add(ListNode* l1, ListNode* l2)36     {37         while(l1->next)38         {39             l1 = l1->next;40         }41         l1->next = l2;42     }43     ListNode* LongToList(long num)44     {45         ListNode* res = new ListNode(-1);46         int n = get_n(num);47         //cout<<"n = "<<n<<endl;48         int x = 0;49         for(int i = 0;i < n;i ++)50         {51             x = num % 10;52             num = num / 10;53             ListNode* node = new ListNode(x);54             add(res,node);55         }56         return res->next;57     }58     ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)59     {60         long num1 = ListToLong(l1);61         long num2 = ListToLong(l2);62         //cout<<"num1 = "<<num1<<" num2 = "<<num2<<endl;63         long num3 = num1 + num2;64         //cout<<"num3 = "<<num3<<endl;65         ListNode* res = LongToList(num3);66         return res;67     }68 };

但上面的代码提交后的结果很让我无语。。。见下图

只有两个示例没有通过。。。将long改成long long依旧不能通过,应该是特意添加的这两个示例,这种算法看来只能做到这步了。

于是我不得不回到最开始的思路,下面是AC代码

 

 1 /** 2  * Definition for singly-linked list. 3  * struct ListNode { 4  *     int val; 5  *     ListNode *next; 6  *     ListNode(int x) : val(x), next(NULL) {} 7  * }; 8  */ 9 class Solution10 {11 public:12     int M = 0;//表示进位13     ListNode* res = new ListNode(0);//结果链表14     int flag = 0;15     void add(ListNode* l1, ListNode* l2)16     {17         while(l1->next)18         {19             l1 = l1->next;20         }21         l1->next = l2;22     }23     ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)24     {25         ListNode* temp = new ListNode(0);26         if(l1 == NULL && l2 == NULL)27             return res->next;28         else if(l1 == NULL)29         {30             temp->val = temp->val + M + l2->val;31             if(temp->val >= 10)32             {33                 temp->val = temp->val - 10;34                 M = 1;35             }36             else37             {38                 M = 0;39             }40             ListNode* e1 = new ListNode(temp->val);41             add(res,e1);42             if(M && (l2->next == NULL))43             {44                 ListNode* e3 = new ListNode(1);45                 add(res,e3);46             }47             addTwoNumbers(NULL,l2->next);48             return res->next;49         }50         else if(l2 == NULL)51         {52             temp->val = temp->val + M + l1->val;53             if(temp->val >= 10)54             {55                 temp->val = temp->val - 10;56                 M = 1;57             }58             else59             {60                 M = 0;61             }62             ListNode* e2 = new ListNode(temp->val);63             add(res,e2);64             if(M && (l1->next == NULL))65             {66                 ListNode* e4 = new ListNode(1);67                 add(res,e4);68             }69             addTwoNumbers(l1->next,l2);70             return res->next;71         }72         else73         {74             int x = l1->val + l2->val + M;75             if(x >= 10)76             {77                 x = x - 10;78                 M = 1;79             }80             else81             {82                 M = 0;83             }84             ListNode* Node = new ListNode(x);85             add(res,Node);86             if(l1->next == NULL && l2->next == NULL && M == 1)87             {88                 ListNode* e = new ListNode(1);89                 add(res,e);90             }91             else92             {93                 addTwoNumbers(l1->next,l2->next);94             }95             return res->next;96         }97     }98 };