2.Add Two Numbers(List To Long)

Posted NULL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2.Add Two Numbers(List To Long)相关的知识,希望对你有一定的参考价值。

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

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

于是我决定采取另一种在网上新学到的方法:这个方法就是将链表中的数字串起来,当做一个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 Solution
10 {
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 Solution
10 {
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             else
37             {
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             else
59             {
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         else
73         {
74             int x = l1->val + l2->val + M;
75             if(x >= 10)
76             {
77                 x = x - 10;
78                 M = 1;
79             }
80             else
81             {
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             else
92             {
93                 addTwoNumbers(l1->next,l2->next);
94             }
95             return res->next;
96         }
97     }
98 };

 

以上是关于2.Add Two Numbers(List To Long)的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode 2. Add Two Numbers

Leetcode 2. Add Two Numbers

2. Add Two Numbers

2. Add Two Numbers

2. Add Two Numbers

2. Add Two Numbers