zoukankan      html  css  js  c++  java
  • LeetCode 148 Sort List 链表上的归并排序和快速排序

    Sort a linked list in O(n log n) time using constant space complexity.

    单链表排序----快排 & 归并排序

    (1)归并排序

     1 /**
     2  * Definition for singly-linked list.
     3  * struct ListNode {
     4  *     int val;
     5  *     ListNode *next;
     6  *     ListNode(int x) : val(x), next(NULL) {}
     7  * };
     8  */
     9 class Solution {
    10 public:
    11     ListNode* sortList(ListNode* head) {
    12         if (head == nullptr || head->next == nullptr)
    13             return head;
    14         ListNode* slow = head;
    15         ListNode* fast = head;
    16         ListNode* mid = nullptr;
    17         while (fast&&fast->next)
    18         {
    19             mid = slow;
    20             slow = slow->next;
    21             fast = fast->next->next;
    22         }
    23         mid->next = nullptr;
    24         return mergeHelp(sortList(head), sortList(slow));
    25     }
    26     ListNode* mergeHelp(ListNode* low, ListNode* high)
    27     {
    28         ListNode* head = new ListNode(-1);
    29         ListNode* cur = head;
    30         while (low&&high)
    31         {
    32             if (low->val < high->val)
    33             {
    34                 cur->next = low;
    35                 low = low->next;
    36             }
    37             else
    38             {
    39                 cur->next = high;
    40                 high = high->next;
    41             }
    42             cur = cur->next;
    43         }
    44         cur->next = low ? low : high;
    45         return head->next;
    46     }
    47 };

    (2)快速排序

    ①.使第一个节点为中心点;
    ②.创建2个指针(first,second),first指向头结点,second指向first的下一个节点;
    ③.second开始遍历,如果发现second的值比中心点的值小,则此时first=first.next,并且执行当前first的值和second的值交换,second遍历到链表尾即可;
    ④.把头结点的值和first的值执行交换。此时first节点为中心点,并且完成1轮快排
    ⑤.使用递归的方法即可完成排序检测是否合法

     1 /**
     2  * Definition for singly-linked list.
     3  * struct ListNode {
     4  *     int val;
     5  *     ListNode *next;
     6  *     ListNode(int x) : val(x), next(NULL) {}
     7  * };
     8  */
     9 class Solution {
    10 public:
    11     ListNode* sortList(ListNode* head) {
    12         if(head==nullptr)
    13             return head;
    14         quickSort(head,nullptr);
    15         return head;
    16     }
    17     void quickSort(ListNode* begin,ListNode* end)
    18     {
    19         if(begin!=end)
    20         {
    21             ListNode* sep=getSeperator(begin,end);
    22             quickSort(begin,sep);
    23             quickSort(sep->next,end);
    24         }
    25     }
    26     ListNode* getSeperator(ListNode* begin,ListNode* end)
    27     {
    28         ListNode* first=begin;
    29         ListNode* second=begin->next;
    30         int key=begin->val;
    31         while(second!=end)
    32         {
    33             if(second->val<key)
    34             {
    35                 first=first->next;
    36                 swap(first,second);
    37             }
    38             second=second->next;
    39         }
    40         swap(begin,first);
    41         return first;
    42     }
    43     void swap(ListNode* a,ListNode* b)
    44     {
    45         int tmp=a->val;
    46         a->val=b->val;
    47         b->val=tmp;
    48     }
    49 };
  • 相关阅读:
    SqlServer 查看数据库中所有存储过程
    SqlServer 查看数据库中所有视图
    SqlServer 查询表的详细信息
    SqlServer 遍历修改字段长度
    net core 操作Redis
    Tuning SharePoint Workflow Engine
    Open With Explorer
    Download language packs for SharePoint 2013
    Change Maximum Size For SharePoint List Template when Saving
    Six ways to store settings in SharePoint
  • 原文地址:https://www.cnblogs.com/xidian2014/p/8530307.html
Copyright © 2011-2022 走看看