143. 重排链表
一、思想
重排链表的解题过程 1、找到链表的中间结点 876 链表的中间结点 2、将后半部分的链表进行翻转 206 反转链表 3、将前半部分和后半部分以一定的规则进行连接
二、代码实现
var reorderList = function(head) {
// 找到中间结点
var mid = findMid(head);
// 根据中间结点将两部分进行拆分
var head2 = mid.next; // 后半部分
mid.next = null;
var head1 = head;
// 反转后半部分
head2 = reverseList(head2);
// 合并前后链表
mergeList(head1,head2);
};
var findMid = function(head){
let slow = head,fast = head;
while(fast && fast.next){
fast = fast.next.next;
slow = slow.next;
}
return slow;
}
var reverseList = function(head){
let pre = null,cur = head;
while(cur){
let temp = cur.next;
cur.next = pre;
pre = cur;
cur = temp;
}
return pre;
}
var mergeList = function(head1,head2){
while(head1 && head2){
let next1 = head1.next,
next2 = head2.next;
head1.next = head2;
head1 = next1;
head2.next = head1;
head2 = next2;
}
}