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

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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值