开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情
前言
从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!
一、题目描述
给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
你应当保留两个分区中每个节点的初始相对位置。
示例 1:
输入: head = [1,4,3,2,5,2], x = 3
输出:[1,2,2,4,3,5]
示例 2:
输入: head = [2,1], x = 2
输出:[1,2]
提示:
- 链表中节点的数目在范围
[0, 200]内 -100 <= Node.val <= 100-200 <= x <= 200
二、思路分析
这是一道中等难度的题目,一开始我想要考虑在原链表中直接变换,首先找出比给定的数大且离给定的数最近的数,然后用一个指针q指向该数,将链表循环进行比较,但在编写程序时发现很难实现,因为链表中各个结点的位置都要进行变动。
然后想到了创建两个链表,分别存储比给定的数大的数和比给定的数小的数。最后将小的链表与大的链表相连接,返回头结点。
三、AC代码
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
ListNode* s = new ListNode();
ListNode* sHead = small;
ListNode* l = new ListNode();
ListNode* lHead = large;
while (head != NULL) {
if (head->val < x) {
s->next = head;
s = s->next;
} else {
l->next = head;
l = l->next;
}
head = head->next;
}
l->next = NULL;
s->next = lHead->next;
return sHead->next;
}
};
提交排名
四、总结
这个题目告诉我,当一条路走不通的时候,可以尝试去试试别的路。不要在一条路上白白的浪费宝贵的时间。