Leetcode算法学习日志-86 Partition List

来源:互联网 发布:linux下如何退出vi 编辑:程序博客网 时间:2024/06/05 08:06

Leetcode 86 Partition List

题目原文

Given a linked list and a value x, partition it such that all nodes less thanx 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的数的左边,且保持原顺序不变。

解法分析

构建两个链表,一个首地址为lessNode,一个首地址为greaterNode,通过修改next指针的操作,将小于x的node链接到lessNode上,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) {        ListNode *nextNode=head;        ListNode *lessNode,*temp1,*greaterNode,*temp2;        int less=0,greater=0;        while(nextNode!=NULL){            if((*nextNode).val<x){//use (*nextNode).val                if(less==0){                    lessNode=nextNode;                    temp1=lessNode;                    less=1;                }                else{                    (*temp1).next=nextNode;                    temp1=nextNode;                }            }            else{                if(greater==0){                    greaterNode=nextNode;                    temp2=greaterNode;                    greater=1;                }                else{                    (*temp2).next=nextNode;                    temp2=nextNode;                }            }            //cout<<(*nextNode).val<<endl;            nextNode=(*nextNode).next;             }        if(less==0||greater==0){            return head;        }        (*temp1).next=greaterNode;        (*temp2).next=NULL;//the end node's next should be NULL        ListNode *pp=lessNode;               // while(pp!=NULL){           // cout<<(*pp).val<<endl;            //pp=(*pp).next;       // }        return lessNode;                    }};
注意全序列没有小于x或只有小于x的数的情况,这时直接返回head。对于一般情况,需要在最后让temp2.next为NULL,不然输出程序会进入死循环。