[路飞]_leetcode-143-重排链表

115 阅读1分钟

一、题目描述

[题目地址]

给定一个单链表 L **的头节点 head ,单链表 L 表示为:

L0 → L1 → … → Ln - 1 → Ln

请将其重新排列后变为:

L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …

不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例 1:

输入: head = [1,2,3,4]
输出: [1,4,2,3]

示例 2:

输入: head = [1,2,3,4,5]
输出: [1,5,2,4,3]

提示:

  • 链表的长度范围为 [1, 5 * 104]
  • 1 <= node.val <= 1000

分析

本题要我们将链表重新排列,排列的规则是 1->n->2->n-1->...

1.首先我们找到链表的中间节点,可以将输入链表转换为双链表
2.前面的是我们的左链表left右边是right
3.对我们的right链表进行翻转reverse
4.将左链表的第一个翻转后的右链表的第一个进行交替进入,重复操作,各区一个值进行交替拼接

代码实现:

var reorderList = function(head) {
    let hair = new ListNode(-1,head)
    let left = hair,right = hair;
    while(right && right.next){
        right = right.next;
        right = right.next;
        left = left.next
    }
    right = left.next;
    left.next = null;
    left = head;
    right = reverse(right);
    while(left && right){
        let lNext = left.next;
        let rNext = right.next;
        right.next = left.next;
        left.next = right;
        left = lNext;
        right = rNext; 
    }
    return hair.next
};

var reverse = function(head){
    let temp = new ListNode(-1);
    while(head){
        let next = head.next;
        head.next = temp.next;
        temp.next = head;
        head = next;
    }
    return temp.next
}

image.png 欢迎建议讨论