写一个函数,实现链表的排序(使链表中元素的从无序到有序,要求从小到大);
时间: 2024-09-18 19:11:47 浏览: 53
在JavaScript中,我们可以使用归并排序算法来实现链表的排序。由于链表的特性,我们需要遍历整个链表并将节点值复制到数组中才能排序,然后再将排序后的数组转换回链表。这里是一个简单的递归归并排序链表的例子:
```javascript
class ListNode {
constructor(val=0, next=null) {
this.val = val;
this.next = next;
}
}
function mergeSortList(head) {
// 如果链表为空或只有一个节点,直接返回
if (!head || !head.next) return head;
// 将链表拆分成两个子链表
let middle = partition(head);
let sortedTail = mergeSortList(middle.next);
// 合并已排序的子链表
return merge(head, sortedTail);
}
// 辅助函数:将链表拆分为两部分
function partition(head) {
let slow = head;
let fast = head.next;
while (fast && fast.next) {
slow = slow.next;
fast = fast.next.next;
}
const newTail = slow.next;
slow.next = null; // 断开
return newTail;
}
// 辅助函数:合并两个已排序的链表
function merge(left, right) {
if (!left) return right;
if (!right) return left;
if (left.val < right.val) {
left.next = merge(left.next, right);
return left;
} else {
right.next = merge(left, right.next);
return right;
}
}
```
这个函数首先检查链表是否为空或只有一个节点,然后递归地分割链表,直到每个子链表只剩下一个节点或为空。接着合并这些子链表,保证它们始终按照升序排列。
阅读全文