-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path0002_add_numbers.c
More file actions
85 lines (70 loc) · 2.11 KB
/
0002_add_numbers.c
File metadata and controls
85 lines (70 loc) · 2.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
struct ListNode *add = NULL;
struct ListNode *prev = NULL;
struct ListNode *new_node = NULL;
int carry = 0;
// Loop until l1 and l2 reaches NULL
while (l1 != NULL || l2 != NULL) {
// Initialize new_node
new_node = (struct ListNode*)malloc(sizeof(struct ListNode));
// If l1 reached NULL
if (l1 == NULL) {
prev -> next = new_node;
// Update new_node
new_node -> val = l2 -> val + carry;
new_node -> next = NULL;
l2 = l2 -> next;
}
// If l2 reached NULL
else if (l2 == NULL) {
prev -> next = new_node;
// Update new_node
new_node -> val = l1 -> val + carry;
new_node -> next = NULL;
l1 = l1 -> next;
}
// If both l1 and l2 have more digits
else {
if (prev == NULL) {
add = new_node;
}
else {
prev -> next = new_node;
}
// Update new_node
new_node -> val = l1 -> val + l2 -> val + carry;
new_node -> next = NULL;
// Update nodes
l1 = l1 -> next;
l2 = l2 -> next;
}
// Update carry
if (new_node -> val > 9) {
// Quotient
carry = new_node -> val / 10;
// Remainder
new_node -> val = new_node -> val % 10;
}
else {
carry = 0;
}
prev = new_node;
}
// If carry is nonzero
if (carry > 0) {
// Initialize new_node
new_node = (struct ListNode*)malloc(sizeof(struct ListNode));
prev -> next = new_node;
// Update new_node
new_node -> val = carry;
new_node -> next = NULL;
}
return add;
}