1
+ /*
2
+ Given the head of a linked list, return the list after sorting it in ascending order.
3
+
4
+ Input: head = [4,2,1,3]
5
+ Output: [1,2,3,4]
6
+
7
+ Input: head = [-1,5,3,4,0]
8
+ Output: [-1,0,3,4,5]
9
+
10
+ Input: head = []
11
+ Output: []
12
+
13
+
14
+ Constraints:
15
+
16
+ The number of nodes in the list is in the range [0, 5 * 104].
17
+ -105 <= Node.val <= 105
18
+
19
+ Follow up: Can you sort the linked list in O(n logn) time and O(1) memory (i.e. constant space)?
20
+ */
21
+
22
+ /* *
23
+ * Definition for singly-linked list.
24
+ * struct ListNode {
25
+ * int val;
26
+ * ListNode *next;
27
+ * ListNode() : val(0), next(nullptr) {}
28
+ * ListNode(int x) : val(x), next(nullptr) {}
29
+ * ListNode(int x, ListNode *next) : val(x), next(next) {}
30
+ * };
31
+ */
32
+ class Solution {
33
+ public:
34
+ ListNode* compute_midpoint (ListNode* head){
35
+ if (head == NULL || head->next == NULL ){
36
+ return head;
37
+ }
38
+ ListNode* slow = head;
39
+ ListNode* fast = head->next ;
40
+ while (fast != NULL && fast->next != NULL ){
41
+ slow = slow->next ;
42
+ fast = fast->next ->next ;
43
+ }
44
+ return slow;
45
+ }
46
+ ListNode* merge_two_lists (ListNode* A, ListNode* B){
47
+ if (A == NULL )
48
+ return B;
49
+ else if (B == NULL )
50
+ return A;
51
+ ListNode* C = NULL ;
52
+ if (A->val < B->val ){
53
+ C = A;
54
+ C->next = merge_two_lists (A->next , B);
55
+ }
56
+ else {
57
+ C = B;
58
+ C->next = merge_two_lists (A, B->next );
59
+ }
60
+ return C;
61
+ }
62
+ ListNode* sortList (ListNode* head) {
63
+ if (head == NULL || head->next == NULL )
64
+ return head;
65
+ ListNode* mid = compute_midpoint (head);
66
+ ListNode* A = head;
67
+ ListNode* B = mid->next ;
68
+ mid->next = NULL ;
69
+ A = sortList (A);
70
+ B = sortList (B);
71
+
72
+ ListNode* C = merge_two_lists (A, B);
73
+ return C;
74
+ }
75
+ };
0 commit comments