Leetcode: Partition List (Java)


http://blog.welkinlan.com/2015/11/12/partition-list-leetcode-java-2/
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 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.
http://blog.welkinlan.com/2015/11/12/partition-list-leetcode-java-2/
    public ListNode partition(ListNode head, int x) {
        if (head == null) return null;
        ListNode helper = new ListNode(0);
        helper.next = head;
        ListNode last = helper; //last node of all elements less than x
        ListNode pre = helper; //pre node
        while (pre.next != null){
            if (pre.next.val < x){
                if (walker != pre){
                    ListNode next = pre.next.next;
                    pre.next.next = last.next;
                    last.next = pre.next;
                    pre.next = next;
                }
                else { //all elements up to now are less than x
                    pre = pre.next;
                }
                last = last.next; //update last
            }
            else {
                pre = pre.next;
            }
        }
        return  helper.next;
    }

X.  http://www.cnblogs.com/springfor/p/3862392.html
new两个新链表,一个用来创建所有大于等于x的链表,一个用来创建所有小于x的链表。
遍历整个链表时,当当前node的val小于x时,接在小链表上,反之,接在大链表上。这样就保证了相对顺序没有改变,而仅仅对链表做了与x的比较判断。
最后,把小链表接在大链表上,别忘了把大链表的结尾赋成null。
 1     public ListNode partition(ListNode head, int x) {
 2         if(head==null||head.next==null)
 3             return head;
 4         
 5         ListNode small = new ListNode(-1);
 6         ListNode newsmallhead = small;
 7         ListNode big = new ListNode(-1);
 8         ListNode newbighead = big;
 9         
10         while(head!=null){
11             if(head.val<x){
12                 small.next = head;
13                 small = small.next;
14             }else{
15                 big.next = head;
16                 big = big.next;
17             }
18             head = head.next;
19         }
20         big.next = null;
21         
22         small.next = newbighead.next;
23         
24         return newsmallhead.next;
25     }

http://www.jiuzhang.com/solutions/partition-list/
    public ListNode partition(ListNode head, int x) {
        if (head == null) {
            return null;
        }
        
        ListNode leftDummy = new ListNode(0);
        ListNode rightDummy = new ListNode(0);
        ListNode left = leftDummy, right = rightDummy;
        
        while (head != null) {
            if (head.val < x) {
                left.next = head;
                left = head;
            } else {
                right.next = head;
                right = head;
            }
            head = head.next;
        }
        
        right.next = null;
        left.next = rightDummy.next;
        return leftDummy.next;
    }

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;
}
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;
    }

Partition: Write code to partition a linked list around a value x, such that all nodes less than x come
before all nodes greater than or equal to x. If x is contained within the list the values of x only need
to be after the elements less than x (see below). The partition element x can appear anywhere in the "right partition"; it does not need to appear between the left and right partitions

public static LinkedListNode partition(LinkedListNode node, int x) {
  LinkedListNode head = node;
  LinkedListNode tail = node;
  
  /* Partition list */
  while (node != null) {
    LinkedListNode next = node.next;
    if (node.data < x) {
      /* Insert node at head. */
      node.next = head;
      head = node;
    } else {
      /* Insert node at tail. */
      tail.next = node;
      tail = node;
    }
    node = next;
  }
  tail.next = null;
  
  return head;
}

public static LinkedListNode partition(LinkedListNode node, int x) {
LinkedListNode beforeStart = null;
LinkedListNode beforeEnd = null;
LinkedListNode afterStart = null;
LinkedListNode afterEnd = null;

/* Partition list */
while (node != null) {
LinkedListNode next = node.next;
node.next = null;
if (node.data < x) {
if (beforeStart == null) {
beforeStart = node;
beforeEnd = beforeStart;
} else {
beforeEnd.next = node;
beforeEnd = node;
}
} else {
if (afterStart == null) {
afterStart = node;
afterEnd = afterStart;
} else {
afterEnd.next = node;
afterEnd = node;
}
}
node = next;
}

/* Merge before list and after list */
if (beforeStart == null) {
return afterStart;
}

beforeEnd.next = afterStart;
return beforeStart;
}
public static LinkedListNode partition(LinkedListNode node, int x) {
  LinkedListNode beforeStart = null;
  LinkedListNode afterStart = null;
  
  /* Partition list */
  while (node != null) {
    LinkedListNode next = node.next;
    if (node.data < x) {
      /* Insert node into start of before list */
      node.next = beforeStart;
      beforeStart = node;
    } else {
      /* Insert node into front of after list */
      node.next = afterStart;
      afterStart = node;
    }
    node = next;
  }
  
  /* Merge before list and after list */
  if (beforeStart == null) {
    return afterStart;
  }
  
  LinkedListNode head = beforeStart;
  while (beforeStart.next != null) {
    beforeStart = beforeStart.next;
  }
  beforeStart.next = afterStart;
  return head;
}

Read full article from My Leetcode: Partition List (Java)

Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts