问题描述:
Sort a linked list in O(n log n) time using constant space complexity.
分析:这里O(nlogn)的时间复杂度,肯定是归并排序和快排。但是这里是list存储的,所以不大好处理。
方法是:
先把list分为两段,每段以null为结尾。不以null为结尾行不行?不行,至少不方便,特别是在合并的时候,找不到终止点。
在归并的时候,维护一个left、right指针,以及一个当前指针和一个头指针。然后再继续合并。
代码如下:20ms
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeNode(struct ListNode* head) {
struct ListNode* slow = head, *fast = head;
while (fast != NULL && fast->next != NULL) {
if (fast && fast != NULL) fast = fast->next;
if (fast && fast != NULL) fast = fast->next;
if (slow && fast != NULL) slow = slow->next;
}
if (fast == slow)//只剩下一个
return slow;
struct ListNode *tmpNode = slow->next;
slow->next = NULL;
struct ListNode *leftHead = mergeNode(head);
struct ListNode *rightHead = mergeNode(tmpNode);
//合并
struct ListNode *left = leftHead, *right = rightHead;
struct ListNode *tmpHead = NULL;
struct ListNode *curNode = NULL;
while (left != NULL && right != NULL) {
if (left->val < right->val) {
if (!curNode) {
tmpHead = left;
}
else
curNode->next = left;
curNode = left;
left = left->next;
}
else {
if (!curNode) {
tmpHead = right;
}
else
curNode->next = right;
curNode = right;
right = right->next;
}
}
if (left != NULL)
curNode->next = left;
else if (right != NULL)
curNode->next = right;
return tmpHead;
}
struct ListNode* sortList(struct ListNode* head) {
return mergeNode(head);
}