Partition List(链表划分)
【难度:Medium】
Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.
You should preserve the original relative order of the nodes in each of the two partitions.
For example,
Given 1->4->3->2->5->2 and x = 3,
return 1->2->2->4->3->5.
给定一个链表和一个值x,将链表划分为所有值小于x的节点位于所有值大于等于x的节点的前面,不改变链表各部分之内的节点相对顺序。
解题思路
遍历整个链表,使用两个虚节点来分别保留两部分的链表节点,最后去掉增添的虚节点,将剩余的两部分拼接起来。
c++代码如下:
/**
* 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) {
if (!head || !head->next)
return head;
ListNode* cur = head;
//虚节点less记录小于x的链表部分
ListNode* less = new ListNode(INT_MIN);
//虚节点more记录大于等于x的链表部分
ListNode* more = new ListNode(INT_MIN);
ListNode* l = less;
ListNode* m = more;
while (cur != NULL) {
if (cur->val < x) {
l->next = cur;
l = l->next;
} else {
m->next = cur;
m = m->next;
}
cur = cur->next;
}
//两部分拼接
l->next = more->next;
m->next = NULL;
return less->next;
}
};