【每日算法】LeetCode 86 —— 分隔链表(一百七十八)

题目内容

给你一个链表的头节点 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]

提示

1、链表中节点的数目在范围 [0, 200] 内
2、-100 <= Node.val <= 100
3、-200 <= x <= 200

题解

本题考查链表操作,题目本质是链表快排的一部分。在思路上,就是把分界点的左边的链表求出来,把分界点右边的链表求出来,然后左边->右边。

具体就是扫描整个链表,然后左边的连接到左边的链表,右边的连接到右边的链表,最后合并即可。

代码

/**
* 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) {
//开两个链表,然后应该是左边的放一块,应该是右边的放一块,然后再合起来。
auto lh = new ListNode(-1), rh = new ListNode(-1);//设置两个虚拟头结点
auto lt = lh, rt = rh;//两个链表的尾结点也需要,因为每次插入是从尾结点之后插入的
for(auto p = head; p; p = p->next){
if(p->val < x) lt = lt -> next = p;
else rt = rt->next = p;
}
lt -> next = rh -> next;
rt -> next = NULL;
return lh->next;
}
};
Author: Frederic Niu
Link: https://www.fredericniu.cn/2021/06/22/【每日算法】LeetCode-86-——-分隔链表(一百七十八)/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
我的公众号