LeetCode86 Partition List 分割链表 C++

Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.

You should preserve the original relative order of the nodes in each of the two partitions.

Example:

Input: head = 1->4->3->2->5->2, x = 3
Output: 1->2->2->4->3->5

题源:here;完整实现:here

思路:

两种方案:1 冒泡法;2 替换法

1 冒泡法

当出现前一个大于目标数后一个小于目标数时进行替换,理论时间上线O(n^2),代码如下:

ListNode* partition(ListNode* head, int x) {
	bool notSort = true;
	while (notSort){
		notSort = false;
		int findEnd = 0, trueEnd = 0;
		ListNode *curr = head;
		while (curr){
			if (curr && curr->next && curr->val >= x && curr->next->val < x){
				int temp = curr->val;
				curr->val = curr->next->val;
				curr->next->val = temp;
				notSort = true;
			}
			curr = curr->next;
		}
	}

	return head;
}

2 替换法

我们记录下第一个大于目标的数,当后面有小于目标的数时就进行替换操作,理论时间上限O(n),代码如下:

ListNode* partition2(ListNode* head, int x){
	ListNode feakHead(0); feakHead.next = head; head = &feakHead;
	ListNode *bigPos = NULL, *curr = head;
	while (curr && curr->next){
		if (curr->next->val >= x && !bigPos){
			bigPos = curr;
		}
		else if (curr->next->val < x && bigPos){
			ListNode *bigNext = bigPos->next;
			bigPos->next = new ListNode(curr->next->val);
			curr->next = curr->next->next;
			bigPos->next->next = bigNext;
			bigPos = bigPos->next;
		}

		curr = curr->next;
	}

	return head->next;
}

最后贴出两种实现运行时间,竟然一样:



猜你喜欢

转载自blog.csdn.net/m0_37518259/article/details/81007799