86. 分隔链表 (Leetcode刷题笔记 )
欢迎大家访问我的GitHub博客
https://lunan0320.github.io/
题目
给你一个链表的头节点 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]
解题代码C++
注意:
此题题目可能不是很明确,其实就是建立两个链表,对于小于x的值是一个链表,对于大于等于x
的值是一个链表。最后把小链表和大链表合并起来即可(过程中结点的顺序不能发生改变)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
//tmp用来遍历原始链表
ListNode* tmp=head;
//小链表
ListNode* small_head=new ListNode(-1);
ListNode* small_end=small_head;
//大链表
ListNode* large_head=new ListNode(-1);
ListNode* large=large_head;
//遍历原始链表
while(tmp){
//依次处理
if(x<=tmp->val){
ListNode* mid=new ListNode(tmp->val);
large->next=mid;
large=large->next;
}else{
ListNode* mid=new ListNode(tmp->val);
small_end->next=mid;
small_end=small_end->next;
}
tmp=tmp->next;
}
//将两个链表合并起来
small_end->next=large_head->next;
return small_head->next;
}
};
算法效率
执行用时: 8 ms , 在所有 C++ 提交中击败了 38.72% 的用户
内存消耗:10.1 MB , 在所有 C++ 提交中击败了7.11% 的用户