您的位置:首页 > 其它

Leetcode: Reorder List

2014-02-14 22:57 375 查看
FROM

思路

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;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: