LeetCode:Sort List
Sort a linked list in
O
(
n
log
n
) time using constant space complexity.
此题用归并排序。
第一次对单链表使用归并,对归并一直不是很熟悉,就此详细记录求解过程。
//此时head1和head2都是已排序的,将head2并入head1中
ListNode* merge(ListNode* head1, ListNode* head2)
{
//新生成一个节点作为头结点,便于对head1头结点进行插入
ListNode* head = new ListNode(0);
head->next = head1;
//pre记录插入位置前一节点
ListNode* pre = head;
while(head1!=NULL && head2!=NULL)
{
if(head1->val < head2->val)
{
head1 = head1->next;
}
else
{
//将节点插入head1中
ListNode* tmp = head2->next;
head2->next = pre->next;
pre->next = head2;
head2 = tmp;
}
//位置后移
pre = pre->next;
}
//若head2还有,则接入head1的最末尾
if(head2 != NULL)
{
pre->next = head2;
}
return head->next;
}
ListNode* mergeSort(ListNode* head)
{
if(head==NULL || head->next==NULL)
{
return head;
}
ListNode* slow = head;
ListNode* fast = head;
//从head指向的链表中进行查找,让slow指向中点,fast指向末尾
while(fast->next!=NULL && fast->next->next!=NULL)
{
slow = slow->next;
fast = fast->next->next;
}
//从链表中间划分,head2指向后半部分
ListNode* head2 = slow->next;
//head1指向前半部分
slow->next = NULL;
ListNode* head1 = head;
//进一步细分链表
head1 = mergeSort(head1);
head2 = mergeSort(head2);
//合并两段
return merge(head1, head2);
}
ListNode *sortList(ListNode *head)
{
return mergeSort(head);
}