Leetcode: Reorder List

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

  

posted @ 2014-02-14 22:57  SangS  阅读(880)  评论(0编辑  收藏  举报