diff --git a/labs/07_list_implementation/README.md b/labs/07_list_implementation/README.md index 6a944a8..cb1c90f 100644 --- a/labs/07_list_implementation/README.md +++ b/labs/07_list_implementation/README.md @@ -36,7 +36,25 @@ Linked List of NodeB nodes: 1 -> 1.41421 -> 1.73205 -> 2 -> 2.23607 -> nullptr **To complete this checkpoint**, show a TA the implementation and the output of your program. -## Checkpoint 3: Debugging a Merge Sort program. +## Checkpoint 3: Merge Two Lists. +*estimate: 30-40 minutes* + +Given two doubly-linked lists: linked list A and linked list B, and both linked lists are sorted. Data in linked list A is sorted in an ascending order. Data in linked list B is also sorted in an ascending order. Merge these two lists such that the data in the merged list is still sorted in an ascending order. + +More specifically, complete the mergeLists() function in [checkpoint3.cpp](checkpoint3.cpp), such that the program prints the following output. + +```console +$ g++ checkpoint3.cpp +$ ./a.out +1 3 5 7 9 +2 4 6 8 10 +1 2 3 4 5 6 7 8 9 10 +10 9 8 7 6 5 4 3 2 1 +``` + +**To complete this checkpoint**, explain to a TA your implementation and show the output of your program. + + diff --git a/labs/07_list_implementation/checkpoint3.cpp b/labs/07_list_implementation/checkpoint3.cpp index 29177e4..2fc1e85 100644 --- a/labs/07_list_implementation/checkpoint3.cpp +++ b/labs/07_list_implementation/checkpoint3.cpp @@ -1,107 +1,93 @@ #include -#include -// prototype of the sorting function -std::vector sortVector(std::vector& nums); +template +class Node { +public: + T value; + Node* next; + Node* prev; -// function to print the elements of a vector -void printVector(const std::vector& nums) { - for (int num : nums) { - std::cout << num << " "; - } - std::cout << std::endl; + // constructor + Node(T val) : value(val), next(nullptr), prev(nullptr) {} +}; + +// function to merge two sorted doubly linked lists +template +Node* mergeLists(Node* head_A, Node* head_B) { } int main() { - // test case 1 - std::vector test1 = {5, 2, 9, 1, 5, 6}; - std::vector result1 = sortVector(test1); - std::cout << "Test Case 1: Original Vector: "; - printVector(test1); - std::cout << "Sorted Vector: "; - printVector(result1); + // create 5 nodes and link them to form a linked list, this is linked list A. + Node* head_A = new Node(1); + Node* second_A = new Node(3); + Node* third_A = new Node(5); + Node* fourth_A = new Node(7); + Node* fifth_A = new Node(9); + + // link the nodes + head_A->next = second_A; + second_A->prev = head_A; + second_A->next = third_A; + third_A->prev = second_A; + third_A->next = fourth_A; + fourth_A->prev = third_A; + fourth_A->next = fifth_A; + fifth_A->prev = fourth_A; + + // traverse linked list A and print the values + Node* current = head_A; + while (current != nullptr) { + std::cout << current->value << " "; + current = current->next; + } std::cout << std::endl; - // test case 2 - std::vector test2 = {3, 8, 2, 7, 4}; - std::vector result2 = sortVector(test2); - std::cout << "Test Case 2: Original Vector: "; - printVector(test2); - std::cout << "Sorted Vector: "; - printVector(result2); + // create 5 nodes and link them to form a linked list, this is linked list B. + Node* head_B = new Node(2); + Node* second_B = new Node(4); + Node* third_B = new Node(6); + Node* fourth_B = new Node(8); + Node* fifth_B = new Node(10); + + // link the nodes + head_B->next = second_B; + second_B->prev = head_B; + second_B->next = third_B; + third_B->prev = second_B; + third_B->next = fourth_B; + fourth_B->prev = third_B; + fourth_B->next = fifth_B; + fifth_B->prev = fourth_B; + + // traverse linked list B and print the values + current = head_B; + while (current != nullptr) { + std::cout << current->value << " "; + current = current->next; + } + std::cout << std::endl; + + Node* head_C; + Node* tail_C; + head_C = mergeLists(head_A, head_B); + + // traverse linked list C and print the values + current = head_C; + while (current != nullptr) { + std::cout << current->value << " "; + // keep tracking current and when current reaches nullptr, tail_C will be the tail node. + tail_C = current; + current = current->next; + } + std::cout << std::endl; + + // traverse linked list C backwards and print the values + current = tail_C; + while (current != nullptr) { + std::cout << current->value << " "; + current = current->prev; + } std::cout << std::endl; return 0; } - -// merge two vectors which are already sorted -std::vector& mergeVectors(std::vector& v1, std::vector& v2){ - int size1 = v1.size(); - int size2 = v2.size(); - std::vector v(size1+size2, 0); - int index1 = 0; - int index2 = 0; - int index = 0; - // traverse v1 and v2 at the same time - while(index1=size1){ - while(index2 sortVector(std::vector& nums) { - int size = nums.size(); - // base case - if(size==1){ - return nums; - } - // general case - // split the vector into two halves. - int mid = size/2; - - // nums1 to store the first half, and nums2 to store the second half. - std::vector nums1; - std::vector nums2; - - // copy the first half - for(int i=0;i