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}
.
解题思路一:
每次将Ln换到前面,得到L0→Ln→L1→L2→L3→,然后对L1使用相同操作,JAVA实现如下:
public void reorderList(ListNode head) { ListNode headCopy = head; while (headCopy != null && headCopy.next != null && headCopy.next.next != null) { ListNode temp = headCopy; while (temp.next.next != null) temp = temp.next; temp.next.next = headCopy.next; headCopy.next = temp.next; temp.next = null; temp = headCopy.next.next; headCopy=headCopy.next.next; } }
结果TLE
解题思路二:
空间换时间,将所有的node存到一个list中,然后每次操作list头尾两个node即可,JAVA实现如下:
public void reorderList(ListNode head) { LinkedList<ListNode> list = new LinkedList<ListNode>(); ListNode headCopy = head,end = head; while (headCopy != null) { list.add(headCopy); headCopy = headCopy.next; } while(list.size()>2){ headCopy=list.poll(); end=list.get(list.size()-1); list.remove(list.size()-1); headCopy.next=end; end.next=list.peek(); list.get(list.size()-1).next=null; } }