[LeetCode] 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.

Solution:

/**
 * 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) return head;
        
        ListNode *ans_head = NULL,*ans_end = NULL, *tmp = head;
        while(tmp != NULL)
        {
            if(tmp -> val < x) 
            {   
                ListNode *ln = new ListNode(tmp -> val);
                if(ans_head == NULL)
                {
                    ans_head = ln;
                    ans_end = ln;
                }
                else
                {
                    ans_end -> next = ln;
                    ans_end = ln;
                }
            }
            
            tmp = tmp -> next;
        }
        
        tmp = head;
        while(tmp != NULL)
        {
            if(tmp -> val >= x) 
            {   
                ListNode *ln = new ListNode(tmp -> val);
                if(ans_head == NULL)
                {
                    ans_head = ln;
                    ans_end = ln;
                }
                else
                {
                    ans_end -> next = ln;
                    ans_end = ln;
                }
            }
            
            tmp = tmp -> next;
        }
        
        return ans_head;
    }
};