Leetcode | Sort List

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

merge sort、heap sort和quick sort都是O(nlgn),但是mergesort和quicksort都是递归的,不是constant space的,heapsort需要有随机访问才行。

mergesort的bottom up实现是可以常数空间的。也适用于链表。

如果是数组,还可以用heapsort。

 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     // merge two list, and return last element (not NULL)

12     ListNode* merge(ListNode *nh, ListNode *p1, ListNode *p2) {

13         while (p1 || p2) {

14             if (p1 && (p2 == NULL || p1->val < p2->val)) {

15                 nh->next = p1;

16                 p1 = p1->next;

17             } else {

18                 nh->next = p2;

19                 p2 = p2->next;

20             }

21             nh = nh->next;

22         }

23         return nh;

24     }

25     

26     // get length of list

27     int getLength(ListNode *head) {

28         int n = 0;

29         while (head) {

30             n++;

31             head = head->next;

32         }

33         return n;

34     }

35     

36     ListNode *sortList(ListNode *head) {

37         int n = getLength(head);

38         ListNode *p1, *p2, *tmp, *newH1, *tail;

39         

40         // merge sort, bottom up

41         for (int l = 1; l < n; l *= 2) {

42             p1 = head;

43             tail = head = NULL; // head of the whole list

44             while (p1) {

45                 p2 = p1;

46                 for (int i = 1; i < l && p2; ++i) {

47                     p2 = p2->next;

48                 }

49                 if (!p2) break;

50                 tmp = p2->next;

51                 p2->next = NULL; // set tail of list 1 to NULL

52                 p2 = tmp; 

53                 for (int i = 1; i < l && tmp; ++i) {

54                     tmp = tmp->next;

55                 }

56                 if (tmp) {

57                     newH1 = tmp->next; // get next head of list 1

58                     tmp->next = NULL; // set tail of list 2 to NULL

59                 } else {

60                     newH1 = NULL;

61                 }

62                 ListNode h(0);

63                 ListNode *last = merge(&h, p1, p2);

64                 if (tail) tail->next = h.next; // connect the sorted part with the current two list

65                 if (!head) head = h.next;

66                 tail = last;

67                 last->next = newH1;

68                 p1 = newH1;

69             }

70         }

71         return head;

72     }

73 };

 

你可能感兴趣的:(LeetCode)