leetcode || sortlist

来源:互联网 发布:侠客风云传优化 编辑:程序博客网 时间:2024/06/06 07:04


题目:sort a linked list in O(n log n) time using constant space complexity

思路:

O(nlogn)实现链表排序,选择余地之后快速、合并、以及堆排序。 堆的空间是O(n),因此只有前两种是可以考虑的。

这道题目采用快速排序会TLE,合并排序就不会,应该是快排的交换次数太多。


#include <iostream>#include <vector>using namespace std;/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; */ struct ListNode {     int val;     ListNode *next;     ListNode(int x) :val(x),next(NULL){} };class Solution {public:   ListNode *sortList(ListNode *head) {       quick_sort(head,NULL);    }   void  myswap(ListNode*s,ListNode*r)   {       int val = s->val;       s->val = r->val;       r->val = val;   }   void quick_sort(ListNode*start,ListNode*end)   {       if(start == end) return;       if(start->next == end) return;       int key = start->val;       ListNode *p = start;       ListNode *q = start->next;       while (q != end)       {           if(q->val > key)           {               myswap(p,q);               p = p->next;           }           q = q->next;       }       quick_sort(start,p);       quick_sort(p->next,end);   }   ListNode* lmerge_sort(ListNode*start)   {       if(start == NULL || start->next == NULL)       {           return start;       }       ListNode *p = start;       ListNode *q = start;       ListNode *pre = NULL;       while (q != NULL && q->next != NULL)       {           q = q->next->next;           pre = p;           p = p->next;       }       pre->next = NULL;       ListNode*head1 = lmerge_sort(start);       ListNode *head2 = lmerge_sort(p);       return lmerge(head1,head2);   }   ListNode* lmerge(ListNode*head1,ListNode*head2)   {       ListNode *head;       ListNode *p;       if(head1 == NULL)       {           return head2;       }       if(head2 == NULL)       {           return head1;       }       if(head1->val < head2->val)       {           head = head1;           head1 = head1->next;       }       else       {           head = head2;           head2 = head2->next;       }       p = head;       while (head1 != NULL &&head2 != NULL)       {           if(head1->val < head2->val)           {               p->next = head1;               head1= head1->next;           }           else           {               p->next = head2;               head2= head2->next;           }           p = p->next;       }       if(head1 != NULL)       {           p->next = head1;       }       if(head2 != NULL)       {           p->next = head2;       }       return head;   }};int main (){}


0 0