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;
else if (head->next->next == NULL)
{
if (head->val > head->next->val)
{
head->val ^= head->next->val;
head->next->val ^= head->val;
head->val ^= head->next->val;
}
return head;
}
ListNode * fast = head, * pre = head, *low = head;
while (fast != NULL && fast->next != NULL)
{
pre = low;
low = low->next;
fast = fast->next->next;
}
pre->next = NULL;
ListNode * node1 = sortList(head);
ListNode * node2 = sortList(low);
return merge(node1, node2);
}
ListNode* merge(ListNode* l1, ListNode* l2)
{
ListNode *dummy = new ListNode(-1);
ListNode *cur = dummy;
while (l1 && l2)
{
if (l1->val < l2->val)
{
cur->next = l1;
l1 = l1->next;
}
else
{
cur->next = l2;
l2 = l2->next;
}
cur = cur->next;
}
if (l1)
cur->next = l1;
if (l2)
cur->next = l2;
return dummy->next;
}
};
测试
#include "head.h"
class Solution {
public:
ListNode *sortList(ListNode *head)
{
if (head == NULL || head->next == NULL)
return head;
else if (head->next->next == NULL)
{
if (head->val > head->next->val)
{
head->val ^= head->next->val;
head->next->val ^= head->val;
head->val ^= head->next->val;
}
return head;
}
ListNode * fast = head, * pre = head, *low = head;
while (fast != NULL && fast->next != NULL)
{
pre = low;
low = low->next;
fast = fast->next->next;
}
pre->next = NULL;
ListNode * node1 = sortList(head);
ListNode * node2 = sortList(low);
return merge(node1, node2);
}
ListNode* merge(ListNode* l1, ListNode* l2)
{
ListNode *dummy = new ListNode(-1);
ListNode *cur = dummy;
while (l1 && l2)
{
if (l1->val < l2->val)
{
cur->next = l1;
l1 = l1->next;
}
else
{
cur->next = l2;
l2 = l2->next;
}
cur = cur->next;
}
if (l1)
cur->next = l1;
if (l2)
cur->next = l2;
return dummy->next;
}
};
int main()
{
Solution s;
int A[] = {2,3,657,1,67,6,89};
vector<int> vec(A, A+7);
ListNode * list = makelist(vec);
s.sortList(list);
printlist(list);
}