/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* sortList(ListNode* head) {
if (!head) {
return NULL;
}
ListNode stVirtualHead;
stVirtualHead.next = head;
// 求取链表长度
int iSize = 0;
while (head) {
++iSize;
head = head->next;
}
ListNode *p1, *p2, *pTail, *pLast;
int iSteps = 1;
while (iSteps < iSize) {
// 每次起始时的上一个节点都是虚拟头节点
pLast = &stVirtualHead;
// 每次都要从链表头开始遍历
head = stVirtualHead.next;
while (head) {
// 得到第一个子序列
p1 = head;
jump(head, iSteps);
// 得到第二个子序列
p2 = head;
jump(head, iSteps);
// 合并两个子序列,并将合并后的序列添加到上一个节点后
pLast->next = merge(p1, p2, pTail);
// 更新新的最末尾节点为合并后的最后一个节点
pLast = pTail;
}
iSteps *= 2;
}
return stVirtualHead.next;
}
inline void jump(ListNode* &pNode, const int iSteps) {
for (int i = 1; (i < iSteps) && pNode; ++i) {
pNode = pNode->next;
}
if (pNode) {
ListNode *pSave = pNode->next;
pNode->next = NULL;
pNode = pSave;
}
}
ListNode* merge(ListNode *p1, ListNode *p2, ListNode* &pTail) {
ListNode stVirtualNode;
ListNode *p = &stVirtualNode;
// 合并
while (p1 && p2) {
if (p1->val < p2->val) {
p->next = p1;
p1 = p1->next;
}
else {
p->next = p2;
p2 = p2->next;
}
p = p->next;
}
if (p1) {
p->next = p1;
}
if (p2) {
p->next = p2;
}
// 定位链表尾
while (p->next) {
p = p->next;
}
pTail = p;
return stVirtualNode.next;
}
};