143. 重排链表 JavaScript实现

300 阅读1分钟

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;
    }
}