链表划分
问题描述:给定一个单链表和数值x,划分链表使得所有小于x的节点排在大于等于x的节点之前。 你应该保留两部分内链表节点原有的相对顺序。 如给定链表 1->4->3->2->5->2->NULL,并且 x=3 返回 1->2->2->4->3->5->NULL。
解题思路:创建两个新链表,分别设为1,2;遍历给定链表,比较每个结点与给定值X值的大小,若比X小,则放入新链表1中,否则放入新链表2中。遍历完毕后,将新链表1 的最后一个结点指向新链表2的第一个结点,来达到将两个链表串起来从来实现划分链表的目的。
实现代码:
class Solution {
public:
/**
* @param head: The first node of linked list.
* @param x: an integer
* @return: a ListNode
*/
ListNode *partition(ListNode *head, int x) {
// write your code here
if(head==NULL) return NULL;
ListNode *leftdummy=new ListNode(0);
ListNode *rightdummy=new ListNode(0);
ListNode *left=leftdummy;
ListNode *right=rightdummy;
while(head!=NULL){
if(head->val<x){
left->next=head;
left=head;
}
else {
right->next=head;
right=head;
}
head=head->next;
}
right->next=NULL;
left->next=rightdummy->next;
return leftdummy->next;
}
};
public:
/**
* @param head: The first node of linked list.
* @param x: an integer
* @return: a ListNode
*/
ListNode *partition(ListNode *head, int x) {
// write your code here
if(head==NULL) return NULL;
ListNode *leftdummy=new ListNode(0);
ListNode *rightdummy=new ListNode(0);
ListNode *left=leftdummy;
ListNode *right=rightdummy;
while(head!=NULL){
if(head->val<x){
left->next=head;
left=head;
}
else {
right->next=head;
right=head;
}
head=head->next;
}
right->next=NULL;
left->next=rightdummy->next;
return leftdummy->next;
}
};