From b814779b7d7ac7d0ab17b7f50c7545484ecbe5e6 Mon Sep 17 00:00:00 2001 From: zhangsan <646228430@qq.com> Date: Fri, 27 Jun 2025 21:24:55 +0800 Subject: [PATCH] =?UTF-8?q?6.27=20=E4=BA=8C=E5=88=B7=E9=93=BE=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/linkedlist/CopyRandomList.java | 1 + src/main/java/linkedlist/ReverseKGroup.java | 10 +++--- src/main/java/linkedlist/SortList.java | 32 +++++++++++++++++++- 3 files changed, 37 insertions(+), 6 deletions(-) diff --git a/src/main/java/linkedlist/CopyRandomList.java b/src/main/java/linkedlist/CopyRandomList.java index 0a8ecca..5ddbad0 100644 --- a/src/main/java/linkedlist/CopyRandomList.java +++ b/src/main/java/linkedlist/CopyRandomList.java @@ -22,6 +22,7 @@ import java.util.HashMap; */ //不会做 需要重做 +//二刷不会 ,很妙的思路 public class CopyRandomList { public Node copyRandomList(Node head) { if (head == null) diff --git a/src/main/java/linkedlist/ReverseKGroup.java b/src/main/java/linkedlist/ReverseKGroup.java index 5f657f9..2d99a36 100644 --- a/src/main/java/linkedlist/ReverseKGroup.java +++ b/src/main/java/linkedlist/ReverseKGroup.java @@ -13,12 +13,12 @@ public class ReverseKGroup { // 反转 [head, tail] 这一段,返回新的头和新的尾 private ListNode[] reverse(ListNode head, ListNode tail) { ListNode prev = tail.next; - ListNode p = head; + ListNode cur = head; while (prev != tail) { - ListNode nxt = p.next; - p.next = prev; - prev = p; - p = nxt; + ListNode nxt = cur.next; + cur.next = prev; + prev = cur; + cur = nxt; } // 反转后,tail 变成新头,head 变成新尾 return new ListNode[]{ tail, head }; diff --git a/src/main/java/linkedlist/SortList.java b/src/main/java/linkedlist/SortList.java index 16d6ffb..253f62f 100644 --- a/src/main/java/linkedlist/SortList.java +++ b/src/main/java/linkedlist/SortList.java @@ -8,11 +8,13 @@ import java.util.List; * 题目: 148. 排序链表 (sortList) * 描述:给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 + 进阶:你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗? * 链接:https://leetcode.cn/problems/sort-list/ */ +//二刷思路会,但链表归并排序不会 public class SortList { - public ListNode sortList(ListNode head) { + public ListNode sortList2(ListNode head) { ListNode cur=head; Listlist=new ArrayList<>(); while (cur!=null){ @@ -28,4 +30,32 @@ public class SortList { } return newnode.next; } + + ListNode sortList(ListNode head) { + if (head == null || head.next == null) return head; + // ① 快慢指针找中点并断链 + ListNode slow = head, fast = head.next; + while (fast != null && fast.next != null) { + slow = slow.next; + fast = fast.next.next; + } + ListNode mid = slow.next; + slow.next = null; + // ② 递归排序左右两段 + ListNode left = sortList(head); + ListNode right = sortList(mid); + // ③ 合并 + return merge(left, right); + } + + ListNode merge(ListNode a, ListNode b) { + ListNode dummy = new ListNode(-1), p = dummy; + while (a != null && b != null) { + if (a.val <= b.val) { p.next = a; a = a.next; } + else { p.next = b; b = b.next; } + p = p.next; + } + p.next = (a != null ? a : b); + return dummy.next; + } }