adding merge sort of list exercise and code

This commit is contained in:
Jidong Xiao
2023-10-08 19:23:36 -04:00
parent caafe5f2e4
commit f0b15a92d9
2 changed files with 85 additions and 6 deletions

View File

@@ -0,0 +1,76 @@
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* mergeLists(ListNode* head1, ListNode* head2){
// the value doesn't matter here
ListNode *head = new ListNode(-1);
ListNode* current;
current = head;
if(head1 == nullptr){
return head2;
}
if(head2 == nullptr){
return head1;
}
while(head1!=nullptr && head2!=nullptr){
if(head1->val < head2->val){
current->next = head1;
head1 = head1->next;
}else{
current->next = head2;
head2 = head2->next;
}
current = current->next;
}
// at this point, one of them has already been merged into the "New" list.
if(head1!=nullptr){
// this means we still have some elements on the 1st list, now let's merge them into the "New" list.
current->next = head1;
}else{
// this means we still have some elements on the 2nd list, now let's merge them into the "New" list.
current->next = head2;
}
return head->next;
}
ListNode* sortList(ListNode* head) {
// base case
if(head==nullptr || head->next==nullptr){
return head;
}
// split the list
ListNode* slow=head;
ListNode* fast=head;
ListNode* tail1;
while(fast!=nullptr && fast->next!=nullptr){
tail1 = slow;
slow = slow->next;
fast = fast->next;
fast = fast->next;
}
// this is the actual split action
tail1->next = nullptr;
// slow actually is now pointing to the head of the second half
// so let's just rename it to make the variable name more meaningful
ListNode* head2 = slow;
// now let's do the recursion
head = sortList(head);
head2 = sortList(head2);
// after the two sub-lists are sorted, we merge them into one list
head = mergeLists(head, head2);
return head;
}
};