2026/4/6 9:13:43
网站建设
项目流程
楼盘网站设计,网站网站做员工犯法吗,衡阳企业网站,wordpress 重置密码忘记场景想象#xff1a;
你手中有长长的一条纸带#xff1a;1 - 2 - 3 - 4 - 5。
题目要求你把它变成#xff1a;1 - 5 - 2 - 4 - 3。
这看起来像是把纸带对折#xff0c;然后像拉链一样把两边的节点交替穿插在一起。
解题策略#xff0…场景想象你手中有长长的一条纸带1 - 2 - 3 - 4 - 5。题目要求你把它变成1 - 5 - 2 - 4 - 3。这看起来像是把纸带对折然后像拉链一样把两边的节点交替穿插在一起。解题策略拆解为三步找中点把链表从中间切开分成左右两半。左半段1 - 2 - 3右半段4 - 5反转右半段把右边的链表逆序。右半段变身5 - 4合并链表左边取一个右边取一个像拉链一样缝合。1连55连22连4...力扣 143. 重排链表https://leetcode.cn/problems/reorder-list/题目分析输入链表头head。目标按 $L_0 \to L_n \to L_1 \to L_{n-1} \to L_2 \to \dots$ 的顺序重排。要求原地操作不能改变节点内部的值只能改指针。核心思维快慢指针 反转 归并这道题没有新知识全是旧知识的排列组合。找中点使用快慢指针参考 LC 876。slow走一步fast走两步。当fast到头时slow就在中间。反转使用双指针迭代参考 LC 206。把后半段链表反转过来方便我们从尾部开始拿节点。合并双指针交替连接。l1指向左半段头l2指向右半段头。暂存l1.next和l2.next然后l1 - l2 - l1_old_next。代码实现 (JavaScript)JavaScript/** * Definition for singly-linked list. * function ListNode(val, next) { * this.val (valundefined ? 0 : val) * this.next (nextundefined ? null : next) * } */ /** * param {ListNode} head * return {void} Do not return anything, modify head in-place instead. */ var reorderList function(head) { if (!head) return; // --- 第一步找中点 (快慢指针) --- let slow head; let fast head; // 注意条件我们要让 slow 停在中间节点如果是偶数个停在前半段的最后一个 while (fast.next ! null fast.next.next ! null) { slow slow.next; fast fast.next.next; } // slow 现在是中点。 // 把链表切断这一步很重要否则后面会死循环 let rightHead slow.next; slow.next null; // --- 第二步反转后半段 (标准反转模板) --- let pre null; let cur rightHead; while (cur ! null) { let temp cur.next; cur.next pre; pre cur; cur temp; } // 反转后pre 就是右半段的新头结点 let l1 head; // 左半段头 let l2 pre; // 右半段头 // --- 第三步合并两个链表 (拉链法) --- // 因为左半段总是 右半段长度所以只要 l2 还有节点就要继续 while (l1 ! null l2 ! null) { // 1. 先把两边原本的“下一步”存起来防止断链 let l1_next l1.next; let l2_next l2.next; // 2. 连线左 - 右 l1.next l2; // 3. 连线右 - 左的下一步 l2.next l1_next; // 4. 指针推移准备处理下一对 l1 l1_next; l2 l2_next; } };深度模拟假设1 - 2 - 3 - 4 - 5Step 1: 找中点fast走两步到 3slow到 2。fast走两步到 5slow到 3。fast再走就要越界了停。slow在 3。切断左边1-2-3-null右边4-5。Step 2: 反转右边4-5变成5-4。1此时l1 1,l2 5。2Step 3: 合并3Round 1:4存路l1_next 2,l2_next 4。5连线1 - 55 - 2。6链表变1 - 5 - 2...移步l1到 2,l2到 4。7Round 2:8存路l1_next 3,l2_next null。9连线2 - 44 - 3。链表变1 - 5 - 2 - 4 - 3...移步l1到 3,l2到 null。End:l2为空结束。总结这道题虽然代码长但逻辑非常清晰。它其实就是LC 876 (找中点) LC 206 (反转) 链表拼接。易错点找完中点后一定要记得slow.next null断开链表否则左半段的尾巴还连着右半段反转后会形成环导致死循环。下一题预告K 个一组翻转链表恭喜你拿下了综合题下一题是 LC 25. K 个一组翻转链表专题八。这是链表题里的 Hard 难度也是字节跳动等大厂面试官最喜欢用来“劝退”或者“定级”的题目。题目1-2-3-4-5K2。结果2-1-4-3-5。如果是 K33-2-1-4-5。这道题是对指针操作精细度的终极考验。准备好迎接这个 Boss 了吗