Skip to content

Commit 603a2e6

Browse files
Add files via upload
1 parent f70687c commit 603a2e6

File tree

1 file changed

+157
-0
lines changed

1 file changed

+157
-0
lines changed
+157
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
// 其实题目中限制了不能对原始链表进行修改反倒是好事,这样就容易了很多
2+
// 实践之后发现把问题想的太简单了,这样写最大的问题就是很容易溢出
3+
// 1560 / 1563 test cases passed.
4+
5+
/**
6+
* Definition for singly-linked list.
7+
* struct ListNode {
8+
* int val;
9+
* ListNode *next;
10+
* ListNode(int x) : val(x), next(NULL) {}
11+
* };
12+
*/
13+
14+
class Solution
15+
{
16+
public:
17+
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
18+
{
19+
long long sum1 = 0, sum2 = 0;
20+
21+
ListNode* ptr1 = l1;
22+
ListNode* ptr2 = l2;
23+
24+
while (ptr1)
25+
{
26+
sum1 *= 10;
27+
sum1 += ptr1->val;
28+
ptr1 = ptr1->next;
29+
}
30+
31+
while (ptr2)
32+
{
33+
sum2 *= 10;
34+
sum2 += ptr2->val;
35+
ptr2 = ptr2->next;
36+
}
37+
38+
long long res = sum1 + sum2;
39+
40+
// 根据计算出来的和,构建链表
41+
ListNode dummyHead(0);
42+
43+
while (res != 0)
44+
{
45+
int val = res % 10;
46+
47+
ListNode* node = new ListNode(val);
48+
ListNode* temp = dummyHead.next;
49+
50+
dummyHead.next = node;
51+
node->next = temp;
52+
53+
res /= 10;
54+
}
55+
return dummyHead.next;
56+
}
57+
};
58+
59+
60+
// 所以使用堆栈来模拟加法过程
61+
// Runtime: 24 ms, faster than 74.03% of C++ online submissions for Add Two Numbers II.
62+
// Memory Usage: 13 MB, less than 51.85% of C++ online submissions for Add Two Numbers II.
63+
64+
/**
65+
* Definition for singly-linked list.
66+
* struct ListNode {
67+
* int val;
68+
* ListNode *next;
69+
* ListNode(int x) : val(x), next(NULL) {}
70+
* };
71+
*/
72+
73+
class Solution
74+
{
75+
public:
76+
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
77+
{
78+
stack<ListNode*> stack1, stack2;
79+
80+
ListNode* ptr1 = l1;
81+
ListNode* ptr2 = l2;
82+
83+
while (ptr1)
84+
{
85+
stack1.push(ptr1);
86+
ptr1 = ptr1->next;
87+
}
88+
89+
while (ptr2)
90+
{
91+
stack2.push(ptr2);
92+
ptr2 = ptr2->next;
93+
}
94+
95+
int base = 0, carry = 0;
96+
ListNode dummyHead(0);
97+
while (!stack1.empty() && !stack2.empty())
98+
{
99+
ptr1 = stack1.top();
100+
stack1.pop();
101+
102+
ptr2 = stack2.top();
103+
stack2.pop();
104+
105+
base = (ptr1->val + ptr2->val + carry) % 10;
106+
carry = (ptr1->val + ptr2->val + carry) / 10;
107+
108+
ListNode* node = new ListNode(base);
109+
ListNode* temp = dummyHead.next;
110+
111+
dummyHead.next = node;
112+
node->next = temp;
113+
}
114+
115+
while (!stack1.empty())
116+
{
117+
ptr1 = stack1.top();
118+
stack1.pop();
119+
120+
base = (ptr1->val + carry) % 10;
121+
carry = (ptr1->val + carry) / 10;
122+
123+
ListNode* node = new ListNode(base);
124+
ListNode* temp = dummyHead.next;
125+
126+
dummyHead.next = node;
127+
node->next = temp;
128+
}
129+
130+
while (!stack2.empty())
131+
{
132+
ptr2 = stack2.top();
133+
stack2.pop();
134+
135+
base = (ptr2->val + carry) % 10;
136+
carry = (ptr2->val + carry) / 10;
137+
138+
ListNode* node = new ListNode(base);
139+
ListNode* temp = dummyHead.next;
140+
141+
dummyHead.next = node;
142+
node->next = temp;
143+
}
144+
145+
// 这里要特别注意一下 [5]+[5]=[1][0]
146+
if (carry != 0)
147+
{
148+
ListNode* node = new ListNode(carry);
149+
ListNode* temp = dummyHead.next;
150+
151+
dummyHead.next = node;
152+
node->next = temp;
153+
}
154+
155+
return dummyHead.next;
156+
}
157+
};

0 commit comments

Comments
 (0)