143. Reorder List
Medium
66755FavoriteShare
Given a singly linked list L: L0→L1→…→Ln-1→Ln,
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…
You may not modify the values in the list's nodes, only nodes itself may be changed.
Example 1:
Given 1->2->3->4, reorder it to 1->4->2->3.
Example 2:
Given 1->2->3->4->5, reorder it to 1->5->2->4->3.
Solution 1: leverage slow-fast two pointer to find the middle place, then split the list into two, reverse the second part, then insert it into the first part.
Solution 2: use a stack to store the list
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public void reorderList(ListNode head) {
if (null == head || null == head.next) {
return;
}
ListNode ptr = head;
Stack<ListNode> stack = new Stack<>();
while (ptr != null) {
stack.push(ptr);
ptr = ptr.next;
}
ptr = head;
int halfOfStack = (stack.size() + 1) / 2;
for (int i = 0; i < halfOfStack; i++) {
ListNode tNode = stack.pop();
tNode.next = ptr.next;
ptr.next = tNode;
ptr = tNode.next;
}
ptr.next = null;
stack.clear();
}
}