Untitled
unknown
c_cpp
5 months ago
2.1 kB
3
Indexable
// Singly-linked lists are already defined with this interface: // template<typename T> // struct ListNode { // ListNode(const T &v) : value(v), next(nullptr) {} // T value; // ListNode *next; // }; // // Function to reverse a linked list ListNode<int>* reverse_linked_list(ListNode<int>* head) { ListNode<int>* prev = nullptr; ListNode<int>* curr = head; while (curr != nullptr) { ListNode<int>* tmp = curr; curr = curr->next; tmp->next = prev; prev = tmp; } return prev; // New head of the reversed list } // Function to add two list elements with carry std::pair<ListNode<int>*, int> add_list_elem(ListNode<int>* in1, ListNode<int>* in2, int carry) { int in1_val = (in1 != nullptr) ? in1->value : 0; int in2_val = (in2 != nullptr) ? in2->value : 0; int total = in1_val + in2_val + carry; return { new ListNode<int>(total % 10000), total / 10000 }; } ListNode<int>* solution(ListNode<int>* a, ListNode<int>* b) { ListNode<int>* new_a = reverse_linked_list(a); ListNode<int>* new_b = reverse_linked_list(b); ListNode<int>* curr_a = new_a; ListNode<int>* curr_b = new_b; int carry = 0; ListNode<int>* new_head = nullptr; ListNode<int>* prev = nullptr; while (curr_a != nullptr || curr_b != nullptr) { auto [curr, new_carry] = add_list_elem(curr_a, curr_b, carry); carry = new_carry; if (prev) { prev->next = curr; } else { new_head = curr; } prev = curr; if (curr_a) curr_a = curr_a->next; if (curr_b) curr_b = curr_b->next; } if (carry) { ListNode<int>* carry_node = new ListNode<int>(carry); prev->next = carry_node; } new_head = reverse_linked_list(new_head); reverse_linked_list(new_a); reverse_linked_list(new_b); return new_head; }
Editor is loading...
Leave a Comment