题目
https://leetcode-cn.com/problems/reorder-list/submissions/
思路
- 快慢指针找到中间节点
- 将链表根据中间节点分成两个,对后面这个链表进行倒序
- 然后在依次组合这两个链表
code
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {void} Do not return anything, modify head in-place instead.
*/
var reorderList = function (head) {
// 找到中间节点
let slow = head;
if (!head.next) return head;
let fast = head.next;
while (fast && fast.next) {
slow = slow.next;
fast = fast.next.next;
}
let mid = slow.next; // 中间节点
slow.next = null;
// 对mid之后的节点进行倒序处理
let pre = null;
while (mid) {
let next = mid.next;
mid.next = pre;
pre = mid;
mid = next;
}
// 对pre,head两个链表进行交叉合并
let p1 = head;
let p2 = pre;
while (p1 && p2) {
let next = p1.next;
p1.next = p2;
p2 = p2.next; // 注意这步要先执行
p1.next.next = next;
p1 = next;
}
return head
};