思路
1. 将后半段截取下来再倒序, 插入到前半段, 时间复杂度为 o(n)
代码
#include <iostream> using namespace std; struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; class Solution { public: void reorderList(ListNode *head) { if(head == NULL) return; int size = 0; ListNode *curNode = head; while(curNode) { size++; curNode = curNode->next; } int step = size - (size >> 1); // pick the larger part ListNode *cursor1 = head, *cursor2 = head; while(--step) cursor2 = cursor2->next; ListNode *tmp = cursor2; if(tmp != NULL) { cursor2 = tmp->next; tmp->next = NULL; } cursor2 = reverseList(cursor2); while(cursor2) { ListNode *tmp = cursor2; cursor2 = cursor2->next; tmp->next = cursor1->next; cursor1->next = tmp; cursor1 = tmp->next; } } ListNode* reverseList(ListNode* head) { if(head == NULL) return head; ListNode *curNode = head; while(curNode->next) { ListNode *nextNode = curNode->next; curNode->next = nextNode->next; nextNode->next = head; head = nextNode; } return head; } }; int main() { int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8}; ListNode* list[10]; int len = 3; for(int i = 0; i < len; i ++) list[i] = new ListNode(arr[i]); for(int i = 0; i < len-1; i ++) list[i]->next = list[i+1]; (new Solution())->reorderList(list[0]); ListNode *lists = list[0]; while(lists) { cout << lists->val << " "; lists = lists->next; } cout << endl; return 0; }