leetcode[86]Partition List

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.

/**
 * 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==NULL||head->next==NULL)return head;
    ListNode *newhead=new ListNode(INT_MIN);
    ListNode *p=newhead;
    p->next=head;
    head=p;
    ListNode *tmp=head;
    ListNode *min2;
    ListNode *max1;
    ListNode *max2;
    while (tmp!=NULL&&tmp->val<x)
    {
        min2=tmp;
        tmp=tmp->next;
    }
    if (tmp!=NULL&&tmp->val>=x)
    {
        max1=tmp;
        max2=tmp;
        tmp=tmp->next;
    }
    while(tmp!=NULL)
    {
        if (tmp->val>=x)
        {
            max2=tmp;
            tmp=tmp->next;
        }
        else
        {
            ListNode *ptmp=tmp->next;
            max2->next=tmp->next;
            min2->next=tmp;    
            tmp->next=max1;
            min2=min2->next;
            tmp=ptmp;
        }
    }
    return newhead->next;
}
/*
ListNode *partition(ListNode *head, int x) {
    if(head==NULL||head->next==NULL)return head;
    ListNode *left=new ListNode(0);
    ListNode *pleft=left;
    ListNode *right=new ListNode(0);
    ListNode *pright=right;
    ListNode *tmp=head;
    while(tmp!=NULL)
    {
        if(tmp->val<x)
        {
            pleft->next=tmp;
            pleft=pleft->next;
        }
        else
        {
            pright->next=tmp;
            pright=pright->next;
        }
        tmp=tmp->next;
    }
    pright->next=NULL;
    pleft->next=right->next;
    return left->next;
}
*/
};
原文地址:https://www.cnblogs.com/Vae1990Silence/p/4281408.html