#排序链表#
使用递归实现。
首先需要将链表分割成两个子链表,所以要找出链表的中点。这里使用快慢指针fast和slow,fast从head开始每次移动两步,slow从head开始每次移动一步,直到fast移动到尾节点时,slow刚好移动到链表的中点位置。
ListNode* sortList(ListNode* head, ListNode* tail){
if (head == nullptr){
return head;
}
if (head->next == tail){
head->next = nullptr;
return head;
}
ListNode* slow = head;
ListNode* fast = head;
while(fast != tail){
slow = slow->next;
fast = fast->next;
if (fast != tail){
fast = fast->next;
}
}
ListNode* mid = slow;
return merge(sortList(head, mid), sortList(mid, tail));
}
代码里面说明只要fast没有移动到尾节点的位置,就需要再移动一次。
分成两个子链表后分别进行排序,然后将排序后的子链表合并。上述过程使用递归实现。
ListNode* merge(ListNode* head1, ListNode* head2){
ListNode* dummyhead = new ListNode(0);
ListNode* temp = dummyhead, *temp1 = head1, *temp2 = head2;
while(temp1 != nullptr && temp2 != nullptr){
if (temp1->val <= temp2->val){
temp->next = temp1;
temp1 = temp1->next;
}else{
temp->next = temp2;
temp2 = temp2->next;
}
temp = temp->next;
}
if (temp1 != nullptr){
temp->next = temp1;
}else if(temp2 != nullptr){
temp->next = temp2;
}
return dummyhead->next;
}