排序链表(以该题为例
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。进阶:你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?(题源自leetcode.148)
显而易见的,对于链表的排序,我们常常使用归并排序,因此这里我将给出三种解法:
首先强调一下,对于链表的操作,最需要注意的几点无非就是dummynode的使用,链表的断开和链表的连接,掌握好这几点,那么很多链表相关的问题就将迎刃而解了。
1.自顶向下的归并排序
类似于数组的归并排序,用的是递归,但是这里与数组的归并不同的地方在于,我们是无法直接获取链表的中间位置的,因此我们必须通过使用快慢节点来找到中间节点,然后再依次对前半部分和后半部分进行归并。
class Solution {
public:
ListNode* sortList(ListNode* head) {
if(!head||!head->next)return head;
ListNode *fast=head,*slow=head,*pre=head;
fast=fast->next->next;
slow=slow->next;
while(fast&&fast->next)
{
fast=fast->next-