题目描述
给出一个链表和一个值 ,以 为参照将链表划分成两部分,使所有小于 的节点都位于大于或等于 的节点之前。
两个部分之内的节点之间要保持的原始相对顺序。
例如:
给出 > 1→4→3→2→5→2 和 x=3,
返回> 1→2→2→4→3→5.
示例1
{1,1},0
输出
{1,1}
思路分析:
将原链表顺序遍历拆分为两个小链表,将其首尾相接就可以得到答案,不需要额外存储空间,时间复杂度为O(n)。
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
class Solution {
public:
/**
*
* @param head ListNode类
* @param x int整型
* @return ListNode类
*/
ListNode* partition(ListNode* head, int x) {
// write code here
if (head==nullptr)//head为空
return head;
ListNode *s = nullptr, *l=nullptr;//双指针
ListNode *largeHead = nullptr, *smallHead = nullptr;//记录大数和小数链表的头部
while (head!=nullptr) {//遍历原链表
if (head->val >= x) {
if (l) {
l->next = head;
l = l->next;
}
else
largeHead = l = head;
}
if (head->val < x) {
if (s) {
s->next = head;
s = s->next;
}
else
smallHead = s = head;
}
head = head->next;
}
//当x小于所有数字或大于所有数字时
if(smallHead==nullptr)
return largeHead;
if(largeHead==nullptr)
return smallHead;
//一般情况下处理大数链表的尾结点的next值
l->next = nullptr;
s->next = largeHead;
return smallHead;
}
};