题目
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、题目要求不能进行值交换,那么只能改变指针来完成任务。
2、对于这种规律形式,怎么才能按下标访问指针呢? 用vector形成下标与指针的映射。
vector<ListNode *> pvec;
复杂度
O(n)形成下标与指针的映射,O(n)进行指针交换:
O(n) + O(n) = O(n)
CODE
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
void reorderList(ListNode *head) {
if (!head || !head->next || !head->next->next) {
return ;
}
vector<ListNode *> pvec;
ListNode* p = head;
while (p) {
pvec.push_back(p);
p = p->next;
}
int psize = pvec.size();
for (int i = 0; i < (psize-1)/2; ++i) {
pvec[i]->next = pvec[(psize-1)-i];
pvec[(psize-1)-i]->next = pvec[i+1];
}
if (psize&1) {
pvec[(psize-1)/2]->next = NULL;
} else {
pvec[(psize-1)/2+1]->next = NULL;
}
}
};
注意:
如果在代码中
int mid = (psize-1)/2;
使用(psize-1)/2的地方都用mid代替,反而效率降低了....为啥呢?