Given a singly linked list L: L0→L1→…→Ln-1→Ln,
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…
You must do this in-place without altering the nodes’ values.
For example,
Given {1,2,3,4}, reorder it to {1,4,2,3}.
解法1:Hashmap + two pointers O(N) Time with O(N) space
用一个hashmap记录每一个node的位置,map的key是位置的坐标。然后用双指针重新把list按顺序连接起来。
C++
Java
解法2: findMiddle + Reverse O(N) Time + O(1) Space
本题也可以用linkedlist的常用算法解决。
第一步可以先找出list的中点,如果是偶数个如:1->2->3-4, 找出的是2,如果是奇数个:1->2->3->4->5, 找出的是3。
第二步:找出以后对后半部分进行reverse操作。
第三步:将右半部份merge到左半部分
这种解法不像第一种解法需要额外的存储空间。
C++
Java