6.27 二刷链表
This commit is contained in:
parent
76f15247d7
commit
b814779b7d
@ -22,6 +22,7 @@ import java.util.HashMap;
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
//不会做 需要重做
|
//不会做 需要重做
|
||||||
|
//二刷不会 ,很妙的思路
|
||||||
public class CopyRandomList {
|
public class CopyRandomList {
|
||||||
public Node copyRandomList(Node head) {
|
public Node copyRandomList(Node head) {
|
||||||
if (head == null)
|
if (head == null)
|
||||||
|
@ -13,12 +13,12 @@ public class ReverseKGroup {
|
|||||||
// 反转 [head, tail] 这一段,返回新的头和新的尾
|
// 反转 [head, tail] 这一段,返回新的头和新的尾
|
||||||
private ListNode[] reverse(ListNode head, ListNode tail) {
|
private ListNode[] reverse(ListNode head, ListNode tail) {
|
||||||
ListNode prev = tail.next;
|
ListNode prev = tail.next;
|
||||||
ListNode p = head;
|
ListNode cur = head;
|
||||||
while (prev != tail) {
|
while (prev != tail) {
|
||||||
ListNode nxt = p.next;
|
ListNode nxt = cur.next;
|
||||||
p.next = prev;
|
cur.next = prev;
|
||||||
prev = p;
|
prev = cur;
|
||||||
p = nxt;
|
cur = nxt;
|
||||||
}
|
}
|
||||||
// 反转后,tail 变成新头,head 变成新尾
|
// 反转后,tail 变成新头,head 变成新尾
|
||||||
return new ListNode[]{ tail, head };
|
return new ListNode[]{ tail, head };
|
||||||
|
@ -8,11 +8,13 @@ import java.util.List;
|
|||||||
* 题目: 148. 排序链表 (sortList)
|
* 题目: 148. 排序链表 (sortList)
|
||||||
* 描述:给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。
|
* 描述:给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。
|
||||||
|
|
||||||
|
进阶:你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?
|
||||||
* 链接:https://leetcode.cn/problems/sort-list/
|
* 链接:https://leetcode.cn/problems/sort-list/
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
//二刷思路会,但链表归并排序不会
|
||||||
public class SortList {
|
public class SortList {
|
||||||
public ListNode sortList(ListNode head) {
|
public ListNode sortList2(ListNode head) {
|
||||||
ListNode cur=head;
|
ListNode cur=head;
|
||||||
List<Integer>list=new ArrayList<>();
|
List<Integer>list=new ArrayList<>();
|
||||||
while (cur!=null){
|
while (cur!=null){
|
||||||
@ -28,4 +30,32 @@ public class SortList {
|
|||||||
}
|
}
|
||||||
return newnode.next;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user