问题描述:
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。
示例:
示例 1:

输入:head = [4,2,1,3]
输出:[1,2,3,4]
示例 2:

输入:head = [-1,5,3,4,0]
输出:[-1,0,3,4,5]
示例 3:
输入:head = []
输出:[]
提示:
- 链表中节点的数目在范围
[0, 5 * 104]内 -105 <= Node.val <= 105
上代码,拿去即可运行:
java
package onlyqi.daydayupgo06.test;
import java.util.Objects;
public class Solution {
public static void main(String[] args) {
// 2---1----3---5---4
ListNode listNode4 = new ListNode(4);
ListNode listNode5 = new ListNode(5, listNode4);
ListNode listNode3 = new ListNode(3, listNode5);
ListNode listNode1 = new ListNode(1, listNode3);
ListNode listNode2 = new ListNode(2, listNode1);
// while (listNode2 != null) {
// System.out.print(listNode2.val+" ");
// listNode2 = listNode2.next;
// }
System.out.println("===========================================================");
ListNode resultNode = sortList(listNode2);
while (resultNode != null) {
System.out.print(resultNode.val + " ");
resultNode = resultNode.next;
}
}
public static ListNode sortList(ListNode head) {
// 基础边界检查
if (head == null || head.next == null) {
return head;
}
ListNode resultNode = head;
ListNode next = head.next;
resultNode.next = null;
while (!Objects.isNull(next)) {
ListNode temp = next;
next = next.next;
if (temp.val < resultNode.val) {
temp.next = resultNode;
resultNode = temp;
} else {
ListNode curr = resultNode;
while (curr.next != null && curr.next.val < temp.val) {
curr = curr.next;
}
temp.next = curr.next;
curr.next = temp;
}
}
return resultNode;
}
// public static ListNode sortList(ListNode head) {
// // 基础边界检查
// if (head == null || head.next == null) {
// return head;
// }
// // resultNode 始终指向已排序部分的头节点
// ListNode resultNode = head;
// // next 指向待排序的下一个节点
// ListNode next = head.next;
// // 初始化:第一个节点已经算作排好序了,先断开它与后面的连接
// resultNode.next = null;
// while (next != null) {
// // 1. 重要:提前保存下一个待排序节点,防止 temp.next 被修改后断链
// ListNode temp = next;
// next = next.next;
// // 2. 情况一:temp 应该插入到排好序部分的【头部】(作为新的头)
// if (temp.val <= resultNode.val) {
// temp.next = resultNode;
// resultNode = temp;
// } else {
// // 情况二:temp 应该插入到排好序部分的【中间或尾部】
// ListNode current = resultNode;
// // 寻找插入位置:找到第一个值大于 temp 的节点,或者到结尾
// while (current.next != null && current.next.val < temp.val) {
// current = current.next;
// }
// // 将 temp 插入到 current 之后
// temp.next = current.next;
// current.next = temp;
// }
// }
// return resultNode;
// }
public static class ListNode {
int val;
ListNode next;
ListNode() {
}
ListNode(int val) {
this.val = val;
}
ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
}
运行结果:

我要刷300道算法题,第147道 。 尽快刷到200,每天搞一道 。