diff --git a/solution/0000-0099/0002.Add Two Numbers/README.md b/solution/0000-0099/0002.Add Two Numbers/README.md index 3806f64b53d17..1fd639e2750ca 100644 --- a/solution/0000-0099/0002.Add Two Numbers/README.md +++ b/solution/0000-0099/0002.Add Two Numbers/README.md @@ -494,6 +494,56 @@ proc addTwoNumbers(l1: var SinglyLinkedList, l2: var SinglyLinkedList): SinglyLi result = aggregate ``` +#### C + +```c +/** + * Definition for singly-linked list. + * struct ListNode { + * int val; + * struct ListNode *next; + * }; + */ + +struct ListNode *addTwoNumbers(struct ListNode *l1, struct ListNode *l2) +{ + struct ListNode *dummy = (struct ListNode *)malloc(sizeof(struct ListNode)); + dummy->val = 0; + dummy->next = NULL; + struct ListNode *curr = dummy; + int carry = 0; + + while (l1 != NULL || l2 != NULL || carry != 0) + { + int sum = carry; + if (l1 != NULL) + { + sum += l1->val; + l1 = l1->next; + } + if (l2 != NULL) + { + sum += l2->val; + l2 = l2->next; + } + + carry = sum / 10; + int val = sum % 10; + + struct ListNode *newNode = (struct ListNode *)malloc(sizeof(struct ListNode)); + newNode->val = val; + newNode->next = NULL; + curr->next = newNode; + curr = curr->next; + } + + struct ListNode *result = dummy->next; + free(dummy); + return result; +} + +``` + diff --git a/solution/0000-0099/0002.Add Two Numbers/README_EN.md b/solution/0000-0099/0002.Add Two Numbers/README_EN.md index f6878f0937322..e9fc9a9bbbc8a 100644 --- a/solution/0000-0099/0002.Add Two Numbers/README_EN.md +++ b/solution/0000-0099/0002.Add Two Numbers/README_EN.md @@ -490,6 +490,55 @@ proc addTwoNumbers(l1: var SinglyLinkedList, l2: var SinglyLinkedList): SinglyLi result = aggregate ``` +#### C + +```c +/** + * Definition for singly-linked list. + * struct ListNode { + * int val; + * struct ListNode *next; + * }; + */ + +struct ListNode *addTwoNumbers(struct ListNode *l1, struct ListNode *l2) +{ + struct ListNode *dummy = (struct ListNode *)malloc(sizeof(struct ListNode)); + dummy->val = 0; + dummy->next = NULL; + struct ListNode *curr = dummy; + int carry = 0; + + while (l1 != NULL || l2 != NULL || carry != 0) + { + int sum = carry; + if (l1 != NULL) + { + sum += l1->val; + l1 = l1->next; + } + if (l2 != NULL) + { + sum += l2->val; + l2 = l2->next; + } + + carry = sum / 10; + int val = sum % 10; + + struct ListNode *newNode = (struct ListNode *)malloc(sizeof(struct ListNode)); + newNode->val = val; + newNode->next = NULL; + curr->next = newNode; + curr = curr->next; + } + + struct ListNode *result = dummy->next; + free(dummy); + return result; +} +``` + diff --git a/solution/0000-0099/0002.Add Two Numbers/Solution.c b/solution/0000-0099/0002.Add Two Numbers/Solution.c new file mode 100644 index 0000000000000..08fd89cf9ded0 --- /dev/null +++ b/solution/0000-0099/0002.Add Two Numbers/Solution.c @@ -0,0 +1,40 @@ +/** + * Definition for singly-linked list. + * struct ListNode { + * int val; + * struct ListNode *next; + * }; + */ + +struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) { + struct ListNode* dummy = (struct ListNode*) malloc(sizeof(struct ListNode)); + dummy->val = 0; + dummy->next = NULL; + struct ListNode* curr = dummy; + int carry = 0; + + while (l1 != NULL || l2 != NULL || carry != 0) { + int sum = carry; + if (l1 != NULL) { + sum += l1->val; + l1 = l1->next; + } + if (l2 != NULL) { + sum += l2->val; + l2 = l2->next; + } + + carry = sum / 10; + int val = sum % 10; + + struct ListNode* newNode = (struct ListNode*) malloc(sizeof(struct ListNode)); + newNode->val = val; + newNode->next = NULL; + curr->next = newNode; + curr = curr->next; + } + + struct ListNode* result = dummy->next; + free(dummy); + return result; +} \ No newline at end of file