Skip to content
On this page

143. 重排链表

原题链接:LeetCode 143. 重排链表

题目描述

给定一个单链表 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`

难度: Medium


题解代码

javascript
/**
 * 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) {
  const arr = []
  let p = head
  while(p) {
    arr.push(p.val)
    p = p.next
  }
  let p1 = head
  let left = true
  while(p1) {
    if (left) {
      p1.val = arr.shift()
    } else {
      p1.val = arr.pop()
    }
    left = !left
    p1 = p1.next
  }
  return head
};

var reorderList = function(head) {
  let p = head, count = 0
  hash = {}
  while (p) {
    hash[count] = p
    p = p.next
    count++
  }
  let left = 1, right = count - 1
  let p1 = head
  for (let i = 0; i < count - 1; i++) {
    if (!(i % 2)) {
      hash[right].next = null
      p1.next = hash[right]
      right--
    } else {
      hash[left].next = null
      p1.next = hash[left]
      left++
    }
    p1 = p1.next
  }
};

技术文档集合