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,找出中间位置的element,将linkedlist分为两半
2,反转后半部分的linkedlist
3,将2部分的linkedlist合成
注意:在找出median的element的时候,我用了最基本的方法,统计出element的总数,然后count/2. 这样就会重复遍历list. 可以设置2个指针,一个每次走一步,另一个每次走2步,走到2步为null的时候,走一步的指针就指向的为中间的element
Java Code:
public void reorderList(ListNode head) {
int count = 0;
ListNode p = head;
while( p != null){
p = p.next;
count++;
}
if(count < 3) return;
//find the median element starting with p
ListNode prev = head;
p = head;
int i = 0;
while( p != null && i <= count/2){
i++;
prev = p;
p = p.next;
}
//reverse the after half linkedList
prev.next = null;
prev = prev.next;
while(p != null){
ListNode tmp = p;
p = p.next;
tmp.next = prev;
prev = tmp;
}
p = prev;
prev = head;
//merge the two half linkedlist
while(p != null && prev != null){
ListNode tmp = p;
p = p.next;
tmp.next = prev.next;
prev.next = tmp;
prev = tmp.next;
}
}
No comments:
Post a Comment