题解 | #牛群分隔#
牛群分隔
https://www.nowcoder.com/practice/16d9dc3de2104fcaa52679ea796e638e
大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。
题目考察的知识点
这道题目考察的主要知识点是链表操作,如何在保持节点相对位置的前提下,按照给定条件对链表进行分割。
题目解答方法的文字分析
我们需要将链表中小于给定值 x 的节点放在大于等于 x 的节点之前,同时保持节点的相对位置不变。可以使用两个链表分别存储小于 x 和大于等于 x 的节点,然后将两个链表连接起来。
思路步骤如下:
- 创建两个新链表,一个用于存储小于 x 的节点(记为
smaller),一个用于存储大于等于 x 的节点(记为greater)。 - 遍历原始链表,将小于 x 的节点连接到
smaller链表上,将大于等于 x 的节点连接到greater链表上。 - 将
smaller链表的尾节点连接到greater链表的头节点,这样就得到了分割后的链表。 - 返回新链表的头节点即可。
本题解析所用的编程语言
本题解析所用的编程语言是C++。
完整且正确的编程代码
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @param x int整型
* @return ListNode类
*/
ListNode* cow_partition(ListNode* head, int x) {
ListNode* smaller_head = new ListNode(0); // 虚拟头节点,用于存储小于 x 的节点
ListNode* greater_head = new ListNode(0); // 虚拟头节点,用于存储大于等于 x 的节点
ListNode* smaller = smaller_head;
ListNode* greater = greater_head;
while (head) {
if (head->val < x) {
smaller->next = head;
smaller = smaller->next;
} else {
greater->next = head;
greater = greater->next;
}
head = head->next;
}
// 连接两个链表
smaller->next = greater_head->next;
greater->next = nullptr; // 结尾置空
ListNode* result = smaller_head->next;
delete smaller_head; // 释放虚拟头节点内存
delete greater_head; // 释放虚拟头节点内存
return result;
}
};
阿Q的题解 文章被收录于专栏
阿Q秋招刷过的题
腾讯成长空间 5881人发布