LeetCode:Reorder List

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

解題思路:

題目要求in-place, 也就是說只能使用O(1)的空間複雜度。

可以找到中間結點,沿着中間結點把鏈表斷開,然後把後半截單鏈表reverse一下,最後合併兩個單鏈表。

代碼如下:

void reorderList(ListNode* head) {
	if(head == nullptr || head->next == nullptr) return;
	ListNode* slow = head, *fast = head, *prev = nullptr;
	while(fast && fast->next) {
		pre = slow;
		slow = slow->next;
		fast = fast->next->next;
	}
	prev-next = nullptr;//cut at middle 
	slow = reverse(slow);
	//merge two lists
	ListNode *curr = head;
	while(curr->next) {
		ListNode *tmp = curr->next;
		curr->next = slow;
		slow = slow->next;
		curr->next->next = tmp;
		curr = tmp;
	}
	curr->next = slow;
}

ListNode* reverse(ListNode *head) {
	if(head == nullptr || head->next == nullptr) return head;
	ListNode *prev = head;
	for (ListNode *curr, *next = curr->next; curr; prev = curr, curr = next, next = next? next->next: nullptr){
		curr->next = prev;
	}
	head->next = nullptr;
	return prev;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章