题解 | #单链表的排序#
单链表的排序
https://www.nowcoder.com/practice/f23604257af94d939848729b1a5cda08
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* public ListNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
public ListNode sortInList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode middle = getMiddle(head);
ListNode nextOfMiddle = middle.next;
middle.next = null;
ListNode left = sortInList(head);
ListNode right = sortInList(nextOfMiddle);
ListNode sortedList = merge(left, right);
return sortedList;
}
private ListNode getMiddle(ListNode head) {
ListNode slow = head, fast = head.next;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
private ListNode merge(ListNode left, ListNode right) {
ListNode result = null;
if (left == null) {
return right;
}
if (right == null) {
return left;
}
if (left.val <= right.val) {
result = left;
left = left.next;
} else {
result = right;
right = right.next;
}
ListNode temp = result;
while (left != null && right != null) {
if (left.val <= right.val) {
temp.next = left;
left = left.next;
} else {
temp.next = right;
right = right.next;
}
temp = temp.next;
}
if (left == null) {
temp.next = right;
} else {
temp.next = left;
}
return result;
}
}
归并排序:1.首先建立一个使用快慢指针找到中间节点的方法;2.分割链表:将中间节点的 next 指针设置为 null,从而将链表分割成两个独立的链表;3.合并链表:这个方法 merge 的目的是合并两个已排序的链表 left 和 right。它通过比较两个链表的节点值,将较小的节点添加到结果链表中,并相应地移动 left 和 right 指针。这个过程重复进行,直到一个链表结束,然后将另一个链表剩余的节点全部添加到结果链表中。
查看12道真题和解析