在 O(n log n) 時間複雜度和常數級的空間複雜度下給鏈表排序。
給出 1->3->2->null
,給它排序變成 1->2->3->null
.
這道題目明顯是需要我們用歸併進行鏈表排序。
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
/**
* Definition of ListNode * class ListNode { * public: * int val; * ListNode *next; * ListNode(int val) { * this->val = val; * this->next = NULL; * } * } */ class Solution { public: /** * @param head: The first node of linked list. * @return: You should return the head of the sorted linked list, using constant space complexity. */ ListNode *sortList(ListNode *head) { // write your code here if(head == NULL || head -> next == NULL) return head; ListNode *mid = findMid(head); ListNode *temp = mid -> next;//將鏈表分成兩段 mid -> next = NULL; ListNode *left = sortList(head); ListNode *right = sortList(temp); return merge(left, right); } ListNode *findMid(ListNode *head)//尋找鏈表中間結點 { if(head == NULL || head -> next == NULL) return head; ListNode *fast = head; ListNode *slow = head; while(fast -> next != NULL && fast -> next -> next != NULL) { fast = fast -> next -> next; slow = slow -> next; } return slow; } ListNode *merge(ListNode *left, ListNode *right)//合併鏈表 { if(left == NULL && right == NULL) return NULL; ListNode *node = new ListNode(0); ListNode *node1 = node; while(left != NULL && right != NULL) { if(left -> val < right -> val) { ListNode *temp = left; left = left -> next; node1 -> next = temp; node1 = node1 -> next; } else { ListNode *temp = right; right = right -> next; node1 -> next = temp; node1 = node1 -> next; } } if(left != NULL) node1 -> next = left; else node1 -> next = right; return node -> next; } }; |