Leetcode: Partition List (Java)



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.
The key is to use fake header, one includes all smaller nodes, another includes all equal or greater nodes.
You should preserve the original relative order of the nodes in each of the two partitions.
public ListNode partition(ListNode head, int x) {
if (head==null || head.next==null){
return head;
}
// leftSide
ListNode preLeftHead=new ListNode (-1);
ListNode leftEnd=preLeftHead;
// rightSide
ListNode preRightHead=new ListNode(-1);
ListNode rightEnd=preRightHead;
ListNode run=head;
while (run!=null){
ListNode temp=run.next;
if (run.val<x){
leftEnd.next=run;
leftEnd=leftEnd.next;
}
else{
rightEnd.next=run;
rightEnd=rightEnd.next;
}
run.next=null;
run=temp;
}
// connect left and right
leftEnd.next=preRightHead.next;
return preLeftHead.next;
}
Another solution from http://www.darrensunny.me/leetcode-partition-list/
public ListNode partition(ListNode head, int x) {
        if (head == null)
            return null;
 
        // Use a sentinel to avoid boundary check
        ListNode sentinel = new ListNode(0);
        sentinel.next = head;
 
        // Find the node whose next is the first one not smaller than x
        ListNode preFirstLarger = sentinel;
        while (preFirstLarger.next != null && preFirstLarger.next.val < x)
            preFirstLarger = preFirstLarger.next;
        if (preFirstLarger.next == null)
            return head;
 
        // Each time we meet a node smaller than x, we move it to before the first
        // one not smaller than x
        ListNode pre = preFirstLarger.next, current = pre.next;
        while (current != null) {
            if (current.val < x) {
                pre.next = current.next;
                current.next = preFirstLarger.next;
                preFirstLarger.next = current;
                preFirstLarger = preFirstLarger.next;
                current = pre.next;
            } else {
                pre = current;
                current = current.next;
            }
        }
 
        return sentinel.next;
    }
Read full article from My Leetcode: Partition List (Java)

No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts