剑指 Offer II 026. 重排链表

112 阅读1分钟

剑指 Offer II 026. 重排链表

硬核操作链表步骤如下:

  • 快慢指针,为了获取[mid,len-1]下半段链表
  • 链表翻转
  • 归并两个链表,相互穿插
var reorderList = function (head) {
  var len = 0;
  for (var p = head; p !== null; p = p.next) {
    len++;
  }
  var mid = len >> 1;
  var fast = head,
    slow = head;
  for (var i = 0; i < mid; i++) {
    fast = fast.next;
  }
  while (fast.next !== null) {
    fast = fast.next;
    slow = slow.next;
  }
  var prev = null;
  var cur = slow;
  var next = cur.next;
  cur.next = null;
  cur = next;
  while (cur) {
    var next = cur.next;
    cur.next = prev;
    prev = cur;
    cur = next;
  }
  var p = head
  while (prev) {
    var next = p.next;
    p.next = prev;
    p = next;
    var pNext = prev.next;
    prev.next = p;
    prev = pNext;
  }
  return p;
};

流程图分析

image.png