在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。
示例 1:
输入: 4->2->1->3
输出: 1->2->3->4
示例 2:
输入: -1->5->3->4->0
输出: -1->0->3->4->5
我的方法是不移动链表中的结点,直接交换节点中的数据。这种方式逻辑相对简单,但时间复杂度不是很好。其实还可以用归并排序,但我现在对该种算法还不是特别熟悉,等熟悉后再来更新用归并排序的解法。
/**
Definition for singly-linked list.
struct ListNode {
int val;
struct ListNode *next;
};
**/
struct ListNode* sortList(struct ListNode* head){
int t;
struct ListNode * p,* q;
if (head == NULL) return head;
p = q = head;
while (p->next) {
while (q) {
if (q->val < p->val) {
t = p->val;
p->val = q->val;
q->val = t;
}
q = q->next;
}
p = p->next;
q = p;
}
return head;
}