zoukankan      html  css  js  c++  java
  • LeetCode:Sort List

    题目如下:(题目链接

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

    上一题中使用了插入排序,时间复杂度为O(n^2)。nlogn的排序有快速排序、归并排序、堆排序。双向链表用快排比较适合,堆排序也可以用于链表,单向链表适合用归并排序。以下是用归并排序的代码:        本文地址

     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         // IMPORTANT: Please reset any member data you declared, as
    13         // the same Solution instance will be reused for each test case.
    14         //链表归并排序
    15         if(head == NULL || head->next == NULL)return head;
    16         else
    17         {
    18             //快慢指针找到中间节点
    19             ListNode *fast = head,*slow = head;
    20             while(fast->next != NULL && fast->next->next != NULL)
    21             {
    22                 fast = fast->next->next;
    23                 slow = slow->next;
    24             }
    25             fast = slow;
    26             slow = slow->next;
    27             fast->next = NULL;
    28             fast = sortList(head);//前半段排序
    29             slow = sortList(slow);//后半段排序
    30             return merge(fast,slow);
    31         }
    32         
    33     }
    34     // merge two sorted list to one
    35     ListNode *merge(ListNode *head1, ListNode *head2)
    36     {
    37         if(head1 == NULL)return head2;
    38         if(head2 == NULL)return head1;
    39         ListNode *res , *p ;
    40         if(head1->val < head2->val)
    41             {res = head1; head1 = head1->next;}
    42         else{res = head2; head2 = head2->next;}
    43         p = res;
    44         
    45         while(head1 != NULL && head2 != NULL)
    46         {
    47             if(head1->val < head2->val)
    48             {
    49                 p->next = head1;
    50                 head1 = head1->next;
    51             }
    52             else
    53             {
    54                 p->next = head2;
    55                 head2 = head2->next;
    56             }
    57             p = p->next;
    58         }
    59         if(head1 != NULL)p->next = head1;
    60         else if(head2 != NULL)p->next = head2;
    61         return res;
    62     }
    63 };

    【版权声明】转载请注明出处:http://www.cnblogs.com/TenosDoIt/p/3434550.html

  • 相关阅读:
    js数组基础
    JavaScript原型链
    js之promise讲解
    ajax登录验证-js
    js事件委托
    js中的回调函数的理解和使用方法
    js闭包的理解
    JavaScript是如何实现继承的(六种方式)
    js创建对象的几种常用方式小结
    canvas绘图详解-08-样式填充
  • 原文地址:https://www.cnblogs.com/TenosDoIt/p/3434550.html
Copyright © 2011-2022 走看看