LeetCode - Reorder List (Java)



Given a singly linked list L: L0→L1→ ... →Ln-1→Ln,
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→...
This problem can be solved by doing the following:
  1. Break list in the middle to two lists (use fast & slow pointers)
  2. Reverse the order of the second list
  3. Merge two list back together
 public static void reorderList(ListNode head) {
 
  if (head != null && head.next != null) {
 
   ListNode slow = head;
   ListNode fast = head;
 
   //use a fast and slow pointer to break the link to two parts.
   while (fast != null && fast.next != null && fast.next.next!= null) {
    //why need third/second condition?
    System.out.println("pre "+slow.val + " " + fast.val);
    slow = slow.next;
    fast = fast.next.next;
    System.out.println("after " + slow.val + " " + fast.val);
   }
 
   ListNode second = slow.next;
   slow.next = null;// need to close first part
 
   // now should have two lists: head and fast
 
   // reverse order for second part
   second = reverseOrder(second);
 
   ListNode p1 = head;
   ListNode p2 = second;
 
   //merge two lists here
   while (p2 != null) {
    ListNode temp1 = p1.next;
    ListNode temp2 = p2.next;
 
    p1.next = p2;
    p2.next = temp1;  
 
    p1 = temp1;
    p2 = temp2;
   }
  }
 }
 
 public static ListNode reverseOrder(ListNode head) {
 
  if (head == null || head.next == null) {
   return head;
  }
 
  ListNode pre = head;
  ListNode curr = head.next;
 
  while (curr != null) {
   ListNode temp = curr.next;
   curr.next = pre;
   pre = curr;
   curr = temp;
  }
 
  // set head node's next
  head.next = null;
 
  return pre;
 }
Read full article from LeetCode – Reorder 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