Sort List

来源:互联网 发布:文学软件 编辑:程序博客网 时间:2024/04/27 22:28

Sort List

 Total Accepted: 4796 Total Submissions: 24553My Submissions

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

归并排序:

 class Solution { //小->大 public:     void merge(ListNode *&p1,ListNode *&p2){         if (!p1 && !p2)  return;         if (!p1) {             p1 = p2;             while (p2->next) {                 p2 = p2->next;             }             return ;         }         if (!p2) {             p2 = p1;             while (p2->next) {                 p2 = p2->next;             }             return ;         }         ListNode *head,*first;         if (p1->val<p2->val){             first = head = p1;             p1 = p1->next;         } else {             first = head = p2;             p2 = p2->next;         }         while (p1 && p2) {             if (p1->val<p2->val) {                 first->next = p1;                 first = p1;                 p1 = p1->next;             } else {                 first->next = p2;                 first = p2;                 p2 = p2->next;             }         }         while (p1) {             first->next = p1;             first = p1;             p1 = p1->next;          }         while (p2) {             first->next = p2;             first = p2;             p2 = p2->next;         }         p1 = head;         p2 = first;     }     ListNode *sortList(ListNode *head) {         ListNode *pre,*last,*p1,*p2;         ListNode *p = head,*temp ;         int len=0;         while ( p ){             p = p->next;             len++;         }         for (int step=1; step<len; step<<=1) {             p = head;             pre = NULL;             while (p ) {                 p1 = p;                 for (int i=1; p && i<step; ++i)                     p = p->next;                 if (!p || !p->next) {                     pre->next = p1;                     break ;                  }                 p2 = p->next;                 p->next = NULL;                 p = p2;                 for (int i=1; p && i<step; ++i)                     p = p->next;                 if (p) {                     temp = p;                     p = p->next;                     temp->next = NULL;                 }                 merge(p1,p2);                 if (pre) {                     pre->next = p1;                 } else{                      head = p1;                 }                 pre = p2;             }         }         return head;     } };


0 0
原创粉丝点击