在 O(n log n) 时间复杂度和常数级的空间复杂度下给链表排序。
样例
给出 1->3->2->null
,给它排序变成 1->2->3->null
.
这道题目明显是需要我们用归并进行链表排序。
C++ Code
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; } }; |