Products
GG网络技术分享 2025-10-28 20:10 1
当链表节点数少许于两个时无需进行沉排。沉排的目的是将链表右半有些较巨大的节点倒序逐个插入左半有些。本文将详细阐述链表沉排的过程。

1. **查找链表的中点**:用迅速磨蹭指针法, 迅速指针每次移动两步,磨蹭指针每次移动一步,当迅速指针到达链表末尾时磨蹭指针位于中点。
2. **断开链表**:在中点处将链表断为两段。
3. **翻转后半段链表**:从后半段链表的第一个节点开头,将其翻转,使其变为倒序。
4. **合并链表**:按照交错顺序合并两段链表, 即将前半段的下一个节点与后半段的第一个节点连接,然后移动到下一个节点,再来一次此过程。
算法的时候麻烦度为O,其中N是链表的长远度。这是基本上原因是我们需要遍历整个链表来找到中点、翻转链表和合并链表。地方麻烦度为O,基本上原因是我们只用了固定数量的额外地方。
链表沉排能用于解决链表相关的问题, 比方说链表的归并排序、链表的交叉点等。还有啊,沉排链表还能用于实现一些要求交错顺序的场合,比方说打印时需要将两个队列依次交错输出。
class Solution {
public void reorderList {
if {
return;
}
ListNode slow = head;
ListNode fast = head;
while {
slow = slow.next;
fast = fast.next.next;
}
ListNode l1 = head;
ListNode l2 = slow.next;
slow.next = null;
ListNode pre = null;
ListNode cur = l2;
while {
ListNode tmp = cur.next;
cur.next = pre;
pre = cur;
cur = tmp;
}
l2 = pre;
while {
ListNode tmp1 = l1.next;
ListNode tmp2 = l2.next;
l1.next = l2;
l1 = tmp1;
l2.next = l1;
l2 = tmp2;
}
}
}
沉排链表是一种实用的链表操作,这些个观点。
Demand feedback