有一个不带头结点的单链表,编程将链表按从小到大的顺序排列。要求不使用另外的数组和结点
时间: 2023-05-19 16:01:45 浏览: 116
可以使用插入排序的思想,从头结点开始遍历链表,将每个结点插入到已排好序的链表中。具体实现可以参考以下代码:
```c
struct ListNode {
int val;
struct ListNode *next;
};
struct ListNode* insertionSortList(struct ListNode* head){
if (head == NULL || head->next == NULL) {
return head;
}
struct ListNode *dummy = (struct ListNode *)malloc(sizeof(struct ListNode));
dummy->next = head;
struct ListNode *cur = head->next, *pre = head;
while (cur != NULL) {
if (cur->val < pre->val) {
struct ListNode *p = dummy;
while (p->next->val < cur->val) {
p = p->next;
}
pre->next = cur->next;
cur->next = p->next;
p->next = cur;
cur = pre->next;
} else {
pre = cur;
cur = cur->next;
}
}
return dummy->next;
}
```
这段代码使用了一个虚拟头结点 dummy,方便处理头结点的插入。时间复杂度为 O(n^2),空间复杂度为 O(1)。
阅读全文