Skip to content

Instantly share code, notes, and snippets.

@junjiah
Last active January 2, 2016 08:59
Show Gist options
  • Save junjiah/8279634 to your computer and use it in GitHub Desktop.
Save junjiah/8279634 to your computer and use it in GitHub Desktop.
solved 'Sort List' on LeetCode http://oj.leetcode.com/problems/sort-list/
/* Merge Sort for linked list is very effective */
/**
* 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) {
int size = 0;
for (ListNode *i = head; i != NULL; i = i->next) size++;
if (size <= 1) return head;
ListNode *left = head, *right;
for (int i=0; i<(size-1)/2; ++i)
left = left->next;
right = left->next;
left->next = NULL;
left = sortList(head);
right = sortList(right);
return merge(left, right);
}
ListNode *merge(ListNode *left, ListNode *right) {
ListNode *start, *iter;
if (left->val < right->val) {
start = left;
left = left->next;
}
else {
start = right;
right = right->next;
}
iter = start;
while (left != NULL && right != NULL) {
if (left->val < right->val) {
iter->next = left;
left = left->next;
iter = iter->next;
}
else {
iter->next = right;
right = right->next;
iter = iter->next;
}
}
// final link
if (left == NULL) iter->next = right;
if (right == NULL) iter->next = left;
return start;
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment