题目:
给你链表的头结点 head
,请将其按 升序 排列并返回 排序后的链表 。
示例 1:
输入:head = [4,2,1,3] 输出:[1,2,3,4]
示例 2:
输入:head = [-1,5,3,4,0] 输出:[-1,0,3,4,5]
示例 3:
输入:head = [] 输出:[]
分析:
可以对链表实施归并排序。利用快慢指针找到中间节点,划分左右链表,使左右区间链表有序,再合并有序的左右链表,得到一个新的有序链表。左、右链表有序的步骤和上述步骤一样。
代码:
class Solution {
public:
ListNode* reuslt = NULL;
ListNode* merg(ListNode* list1, ListNode* list2)
{
if (!list1 && !list2) return NULL;
if (!list1 && list2) return list2;
if (list1 && !list2) return list1;
ListNode* plst1 = NULL;
ListNode* plst2 = list1;
ListNode* blst1 = list2;
ListNode* blst2 = list2->next;
while (plst2 != NULL && blst1 != NULL)
{
if (blst1->val <= plst2->val)//前插
{
if (plst1 != NULL)//判断是不是头节点
{
blst1->next = plst2;
plst1->next = blst1;
plst1 = plst1->next;
//更新
blst1 = blst2;
if (blst2 != NULL)
{
blst2 = blst2->next;
}
}
else//是头节点
{
blst1->next = plst2;
plst1 = blst1;
blst1 = blst2;
if (blst2 != NULL)
{
blst2 = blst2->next;
}
list1 = plst1;//更新链表头
}
}
else
{
//双指针继续走
plst1 = plst2;
plst2 = plst2->next;
}
}
if (plst2 == NULL && blst1 != NULL)
{
plst1->next = blst1;
}
return list1;
}
ListNode* del(ListNode* pleft, ListNode* pright)
{
if (pleft == NULL) return NULL;
if (pleft->next == pright) return pleft;
ListNode* plow = pleft;
ListNode* pfast = pleft;
//找到中间节点,进行左右区间划分
while (pfast->next != pright && pfast->next->next != pright)
{
plow = plow->next;
pfast = pfast->next->next;
}
pfast = plow->next;
plow->next = NULL;
ListNode* leftlist = del(pleft, NULL);
ListNode* rightlist = del(pfast, NULL);
reuslt =merg(leftlist,rightlist);
return reuslt;
}
ListNode* sortList(ListNode* head) {
if (head == NULL) return NULL;
return del(head, NULL);
}
};