终于 ac 一道题···
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode * findMid(ListNode *phead)
{
if (phead->next->next == NULL || phead->next == NULL || phead == NULL)
{
return phead;
}
ListNode * pslow = phead;
ListNode * pquick = phead;
while (pquick->next && pquick->next->next)// the last second is not visited; after this process the "pquick" point to the last second;
{
pslow = pslow->next;
pquick = pquick->next->next;
}
return pslow;
}
ListNode *Merge(ListNode *ph1, ListNode *ph2)
{
if (ph1 == NULL) return ph2;
if (ph2 == NULL) return ph1;
ListNode *p1 = ph1;
ListNode *p2 = ph2;
ListNode *pnew = 0;
if (p1->val > p2->val)
{
pnew = p2;
p2 = p2->next;
}
else
{
pnew = p1;
p1 = p1->next;
}
ListNode *pres = pnew;
while (p1 && p2)
{
if (p1->val < p2->val)
{
pnew->next = p1;
p1 = p1->next;
}
else
{
pnew->next = p2;
p2 = p2->next;
}
pnew = pnew->next;
}
p1 == NULL ? (pnew->next = p2) : (pnew->next = p1);
return pres;
}
ListNode * sortList(ListNode *head)
{
if (head == NULL || head->next == NULL) return head;
ListNode *mid = findMid(head);
ListNode *head2 = mid->next;
mid->next = NULL;
ListNode *ph1 = sortList(head);
ListNode *ph2 = sortList(head2);
return Merge(ph1, ph2);
//Merge(sortList(head), sortList(head2));
}
};