adding merge sort of list exercise and code
This commit is contained in:
76
leetcode/p148_sortlist.cpp
Normal file
76
leetcode/p148_sortlist.cpp
Normal 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;
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user