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
.
The solution is trivial. We can set up two pointers to keep linking nodes that are less than the given value and linking nodes that are greater and equal to the given value. And at then end concatenate the two list together.
C++ Code:
/* * func: partition_list * goal: partition the list so that all nodes less thanx come before nodes greater * than or equal to x. * @param head: head node of the list * @param x: target value * return: new head node */ /* * Set up a poiter to keep track of the nodes that greater and equal to the given value and another * pointer for nodes that less than the given value * complexity: time O(n), space O(1) */ ListNode *partition_list(ListNode *head, int x){ ListNode *new_head = nullptr; ListNode *greater = nullptr; ListNode *greater_head = nullptr; ListNode *less = nullptr; ListNode *less_head = nullptr; ListNode *iter = head; while(iter != nullptr){ if(iter->val >= x){ if(!greater){ greater = iter; greater_head = iter; }else{ greater->next = iter; greater = greater->next; } iter = iter->next; }else{ if(!less){ less = iter; less_head = iter; }else{ less->next = iter; less = less->next; } iter = iter->next; } } //Set the head of less list to the new head if less list exists if(less){ less->next = greater_head; new_head = less_head; }else{ new_head = greater_head; } //Set the tail node's next to null if(greater){ greater->next = nullptr; } return new_head; }
Python Code:
# func: rearrange the list so that nodes less than the given value to the left and others to the right # @param head: head node of the list # @param x: the given value # @return: the new head of the list # complexity: time O(n), space O(1) def partition_list(head, x): iter = head less_iter = None less_head = None greater_iter = None greater_head = None while iter: if iter.val >= x: if not greater_head: greater_head = iter greater_iter = iter else: greater_iter.next = iter greater_iter = greater_iter.next else: if not less_head: less_head = iter less_iter = iter else: less_iter.next = iter less_iter = less_iter.next iter = iter.next if not less_head: new_head = greater_head else: less_iter.next = greater_head new_head = less_head if greater_head: greater_iter.next = None return new_head
No comments:
Post a Comment