77 lines
2.3 KiB
C++
77 lines
2.3 KiB
C++
/**
|
|
* 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;
|
|
}
|
|
};
|