LeetCode86-分隔链表

给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。

你应当保留两个分区中每个节点的初始相对位置。

示例:

输入: head = 1->4->3->2->5->2, x = 3
输出: 1->2->2->4->3->5

一、思路

(一)暴力法

对链表进行遍历,得到两个链表,链表A中所有的值小于x,链表B中所有的值大于或等于x

C++代码:

class Solution {
public:
	ListNode* partition(ListNode* head, int x) {
		if (head == NULL || head->next == NULL)
			return head;
		bool less_first = false;
		if (head->val < x)
			less_first = true;
		ListNode *p = head;
		vector<int> less, great;
		while (p != NULL) {
			if (p->val < x)
				less.push_back(p->val);
			else
				great.push_back(p->val);
			p = p->next;
		}
		p = head;
		for (int i = 0; i < less.size(); i++) {
			p->val = less[i];
			p = p->next;
		}
		for (int i = 0; i < great.size(); i++) {
			p->val = great[i];
			p = p->next;
		}
		return head;
	}
};

执行效率:

在这里插入图片描述

(二)指针法

设置两个链表,一个存放小于x的节点,另一个存放大于等于x的节点

C++代码:

class Solution {
public:
	ListNode* partition(ListNode* head, int x) {
		ListNode less_head(0);
		ListNode great_head(0);
		ListNode *less = &less_head;
		ListNode *great = &great_head;
		while (head) {
			if (head->val < x) {
				less->next = head;
				less = head;
			}
			else {
				great->next = head;
				great = head;
			}
			head = head->next;
		}
		less->next = great_head.next;
		great->next = NULL;
		return less_head.next;
	}
};

执行效率:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/lyd1995/article/details/89378568