https://leetcode.cn/problems/partition-list-lcci/description/
给你一个链表的头节点 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
]
[0, 200]
[0,200] 内
−
100
<
=
N
o
d
e
.
v
a
l
<
=
100
-100 <= Node.val <= 100
−100<=Node.val<=100
−
200
<
=
x
<
=
200
-200 <= x <= 200
−200<=x<=200
可以使用
「分流思想」
「分流思想」
「分流思想」,創建兩個鏈表 —— 小鏈表 和 大鏈表。
小鏈表 記錄小於 x
的數字,大鏈表記錄大於 x
的數字。我們只需要遍歷一遍鏈表即可做到,分流完畢後再把小鏈表和大鏈表合體,最後返回結果即可。
程式碼如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
// 創建小鏈表和大鏈表
ListNode* s = new ListNode(0);
ListNode* b = new ListNode(0);
// 記錄起始位置,哨兵位(無數據)
ListNode* sHead = s;
ListNode* bHead = b;
// 分流
while (head != nullptr) {
if (head->val < x) {
s->next = head; // 把該節點給 s
s = s->next;
}
else { // head->val >= x
b->next = head; // 把該節點給b
b = b->next;
}
head = head->next;
}
// 連接
b->next = nullptr; // 讓大鏈表結尾接上 nullptr
s->next = bHead->next; // 讓小鏈表結尾改爲大鏈表開頭有效數據位
return sHead->next;
}
};