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) { // Start typing your C/C++ solution below // DO NOT write int main() function if (head == NULL) return head; ListNode *leftHead = NULL, *rightHead = NULL, *end; ListNode ** before = &leftHead, **after = &rightHead; while (head != NULL) { if (head->val >= x) { *after = head; after = &(head->next); }else { *before = head; before = &(head->next); } // use end to break the new attached node from the original list end = head; head = head->next; end->next = NULL; } *before = rightHead; // connect two lists return leftHead; } };Update on Sep-19-2014
Without double-pointer
/** * 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 *head1 = NULL, *head2 = NULL,*tail1 = NULL,*tail2 = NULL; while (head != NULL) { if (head->val < x) { if (head1 == NULL) { head1 = head; tail1 = head; }else { tail1->next = head; tail1 = tail1->next; } }else { if (head2 == NULL) { head2 = head; tail2 = head; }else { tail2->next = head; tail2 = tail2->next; } } head = head->next; } // merge if (tail1 != NULL) tail1->next = head2; if (tail2 != NULL) tail2->next = NULL; if (head1 == NULL) return head2; return head1; } };
No comments:
Post a Comment