题目链接:https://oj.leetcode.com/problems/sort-list/
解题思路:
因为是要求仅使用常数级的辅助空间,因此只能通过少量的辅助空间在原链表地址上完成排序,并且要求时间复杂度为O(nlogn)。进过思考,最好的解决方案是使用归并排序,这样可以减小链表操作的难度。
代码:
/**
* 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 block_size = 1;
int len = 0;
ListNode* temp = head;
ListNode *tmp , *lhead , *rhead = NULL;
while (temp != NULL) {
temp = temp->next;
len++;
}
if (len == 0) return head;
ListNode* virturl_head = new ListNode(0);
ListNode* last = NULL;
ListNode* iter = NULL;
virturl_head->next = head;
while (block_size < len) {
int index = 0;
last = virturl_head;
iter = virturl_head->next;
while (index < len) {
int llen = (len - index) < block_size ? (len - index) : block_size;
int rlen = (len - index - llen) < block_size ? (len - index - llen) : block_size;
lhead = iter;
rhead = NULL;
if (rlen != 0) {
for (int i = 0; i < llen - 1; i++)
iter = iter->next;
rhead = iter->next;
iter->next = NULL;
iter = rhead;
for (int i = 0; i < rlen - 1; i++)
iter = iter->next;
tmp = iter->next;
iter->next = NULL;
iter = tmp;
}
while (lhead || rhead) {
if (rhead == NULL || (lhead != NULL && lhead->val < rhead->val)) {
last->next = lhead;
last = last->next;
lhead = lhead->next;
}
else {
last->next = rhead;
last = last->next;
rhead = rhead->next;
}
}
last->next = NULL;
index += (llen + rlen);
}
block_size <<= 1;
}
return virturl_head->next;
}
};