[路飞]_leetcode_143.重排链表

101 阅读1分钟

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

L0 → L1 → … → Ln - 1 → Ln

请将其重新排列后变为:

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

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

解题思路

  1. 首先先取链表的一半,设快慢指针获取链表的一半一半
    1. 快指针走2步,慢指针走一步
  2. 然后反转后半段
  3. 在每段各取一个节点连接
1 -> 2 -> 3 -> 4 -> 5 -> 6
^
|
lr
1 -> 2 -> 3 -> 4 -> 5 -> 6
     ^    ^
     |    |
     l    r
1 -> 2 -> 3 -> 4 -> 5 -> 6
          ^         ^
          |         |
          l         r
1 -> 2 -> 3 -> 4 -> 5 -> 6 -> null
               ^               ^
               |               |
               l               r


1 -> 2 -> 3 -> 4

5 -> 6 => 6 -> 5

1 -> 6 -> 2 -> 5 -> 3 -> 4

代码

var reorderList = function(head) {
    let right = left = head;
    while(right && right.next) {
        left = left.next;
        right = right.next.next;
    }
    
    right = reverse(left.next);
    left.next = null;
    left = head;
    while (right) {
        let lnext = left.next;
        let rnext = right.next;
        left.next = right;
        right.next = lnext;
        left = lnext;
        right = rnext;
    }

    return head;
};

var reverse = function(head) {
    let pre = null, cur = head;
    while (cur) {
        [cur.next, pre, cur] = [pre, cur, cur.next]
    }
    return pre;
}