import java.util.*;
class Solution {
public ListNode sortList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode pivot = head; // 选取头节点作为基准元素
ListNode smallerHead = new ListNode(0); // 小于基准元素的链表
ListNode smallerTail = smallerHead;
ListNode equalHead = new ListNode(0); // 等于基准元素的链表
ListNode equalTail = equalHead;
ListNode greaterHead = new ListNode(0); // 大于基准元素的链表
ListNode greaterTail = greaterHead;
ListNode current = head;
while (current != null) {
if (current.val < pivot.val) { // 当前节点的值小于基准元素的值
smallerTail.next = current;
smallerTail = smallerTail.next;
} else if (current.val >
pivot.val) { // 当前节点的值大于基准元素的值
greaterTail.next = current;
greaterTail = greaterTail.next;
} else { // 当前节点的值等于基准元素的值
equalTail.next = current;
equalTail = equalTail.next;
}
current = current.next;
}
smallerTail.next = null; // 小于基准元素的链表末尾置空
greaterTail.next = null; // 大于基准元素的链表末尾置空
equalTail.next = null; // 等于基准元素的链表末尾置空
ListNode sortedSmaller = sortList(
smallerHead.next); // 对小于基准元素的链表排序
ListNode sortedGreater = sortList(
greaterHead.next); // 对大于基准元素的链表排序
ListNode result = concat(sortedSmaller,
equalHead.next); // 连接排好序的三部分链表
result = concat(result, sortedGreater);
return result;
}
private ListNode concat(ListNode head1, ListNode head2) {
if (head1 == null) {
return head2;
}
ListNode current = head1;
while (current.next != null) {
current = current.next;
}
current.next = head2;
return head1;
}
}
该题主要考察的知识点就是链表和排序算法。
代码:
- 判断链表是否为空或只有一个节点,如果是,则无需排序,直接返回链表。
- 选取一个基准元素,可以选择链表的头节点作为基准元素。
- 创建三个指针smallerHead、greaterHead和equalHead,分别用于指向小于基准元素的链表、大于基准元素的链表和等于基准元素的链表的头节点。
- 遍历链表,根据节点的值与基准元素的比较结果,将节点插入到对应的链表中。遍历完成后,原链表被拆分成三个部分。
- 分别对小于基准元素的链表、大于基准元素的链表和等于基准元素的链表进行递归排序。得到排好序的三个链表。
- 将三个排好序的链表连接起来,返回排好序的链表。
- 在递归排序的过程中,使用concat函数将排好序的链表连接起来。
- 最终返回排好序的链表。

京公网安备 11010502036488号