1.如果不限制空间大小,直接遍历一遍链表,把数据拿出来排好序后再放回原链表。空间O(n),时间可以到O(nlgn)
2.如果限制空间大小O(1),那么可以直接在链表上进行排序,选择排序比较好写,但是时间上得到O(n*n),这道题过不了
注意:哨兵的设置,可以有效的减少不必要的操作
class Solution { public: /** * * @param head ListNode类 the head node * @return ListNode类 */ ListNode* sortInList(ListNode* head) { // write code here if(!head) return nullptr; ListNode* t = new ListNode(0); //放入开头的哨兵,减少不必要的操作 t->next = head; ListNode* start = t; while(start->next) { ListNode* pre = start, * curr = start->next, * minpre = start, * min = start->next; while(curr) { if(curr->val < min->val) { min = curr; minpre = pre; } pre = curr; curr = curr->next; } minpre->next = min->next; min->next = start->next; start->next = min; start = start->next; } return head; } };