题目描述:给你链表的头结点 ,请将其按 升序 排列并返回 排序后的链表 。
获得更多?算法思路:代码文档,算法解析的私得。
运行效果
完整代码
import java.util.List;
/**
* 2 * @Author: LJJ
* 3 * @Date: 2023/8/4 13:16
* 4
*/
public class MergeSortLinkedList {
static class ListNode {
int val;
ListNode next;
ListNode(int val) {
this.val = val;
}
}
public ListNode sortList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
// 找到链表中点,将链表拆分为两个子链表
ListNode mid = findMiddle(head);
ListNode left = head;
ListNode right = mid.next;
mid.next = null;
// 递归排序两个子链表
left = sortList(left);
right = sortList(right);
// 合并两个有序子链表
return merge(left, right);
}
// 找到链表的中点(如果链表长度为奇数,则返回中间节点;如果链表长度为偶数,则返回中间的前一个节点)
private ListNode findMiddle(ListNode head) {
ListNode slow = head;
ListNode fast = head.next;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
// 合并两个有序链表
private ListNode merge(ListNode l1, ListNode l2) {
ListNode dummy = new ListNode(-1);
ListNode current = dummy;
while (l1 != null && l2 != null) {
if (l1.val < l2.val) {
current.next = l1;
l1 = l1.next;
} else {
current.next = l2;
l2 = l2.next;
}
current = current.next;
}
// 将剩余的节点连接到合并后的链表末尾
if (l1 != null) {
current.next = l1;
}
if (l2 != null) {
current.next = l2;
}
return dummy.next;
}
public void printLinkList(ListNode head){
ListNode current = head;
while (current != null){
System.out.print(current.val + " -> ");
current = current.next;
}
System.out.println("null");
}
public static void main(String[] args) {
MergeSortLinkedList mergeSortLinkedList = new MergeSortLinkedList();
ListNode head = new ListNode(3); // 创建第一个节点,值为 3
head.next = new ListNode(2); // 创建第二个节点,值为 2,并将它设置为第一个节点的下一个节点
head.next.next = new ListNode(4); // 创建第三个节点,值为 4,并将它设置为第二个节点的下一个节点
head.next.next.next = new ListNode(1); // 创建第四个节点,值为 1,并将它设置为第三个节点的下一个节点
head.next.next.next.next = new ListNode(5); // 创建第五个节点,值为 5,并将它设置为第四个节点的下一个节点
System.out.println("原始链表:");
mergeSortLinkedList.printLinkList(head);
ListNode sortedList = mergeSortLinkedList.sortList(head);
System.out.println("排序后的链表:");
mergeSortLinkedList.printLinkList(sortedList);
}
}