Leetcode: Reorder List
思路
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;
}

浙公网安备 33010602011771号