题目
Number: 86
Difficulty: Medium
Tags: Linked List, Two Pointers
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,保持原来元素的相对位置。
代码
在原链表上移动交换结点:
ListNode* partition(ListNode* head, int x) {
if(!head)
return head;
ListNode *p = head, *q = p, *pre = NULL, *qpre = NULL;
while(q){
while(p && p->val < x){
pre = p;
p = p->next;
}
q = p;
while(q && q->val >= x){
qpre = q;
q = q->next;
}
if(q == NULL)
return head;
if(pre == NULL){
qpre->next = q->next;
q->next = p;
head = q;
pre = head;
}
else{
qpre->next = q->next;
pre->next = q;
q->next = p;
pre = pre->next;
}
}
return head;
}
生成两个链表,然后再合并两个链表。
ListNode* partition(ListNode* head, int x) {
ListNode node1(0), node2(0);
ListNode *p = &node1, *q = &node2;
while(head){
if(head->val < x){
p->next = head;
p = p->next;
}
else{
q->next = head;
q = q->next;
}
head = head->next;
}
q->next = NULL;
p->next = node2.next;
return node1.next;
}