Leetcode 148. Sort List (Medium) (cpp)
Tag: Linked List, Sort
Difficulty: Medium
/*
148. Sort List (Medium)
Sort a linked list in O(n log n) time using constant space complexity.
*/
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* sortList(ListNode* head) {
if (head == NULL || head -> next == NULL) {
return head;
}
ListNode *newhead = split(head);
return sort_combine(sortList(head), sortList(newhead));
}
private:
ListNode* split(ListNode* head) {
ListNode *s = head, *f = head;
while(f -> next != NULL && f -> next -> next != NULL) {
s = s -> next;
f = f -> next -> next;
}
f = s -> next;
s -> next = NULL;
return f;
}
ListNode* sort_combine(ListNode* head, ListNode* s) {
ListNode *head_new = new ListNode(-1), *p = head_new;
while (head != NULL || s != NULL) {
if (head == NULL || s != NULL && head -> val > s -> val) {
p -> next = s;
s = s -> next;
} else {
p -> next = head;
head = head -> next;
}
p = p -> next;
}
return head_new -> next;
}
};