Reorder a Linked List.

Sneha Michelle,Linked Lists

Problem Link

Reorder List (opens in a new tab)

Problem Statement

This problem was a bit difficult because in a linked list you cant traverse backwards.. so how do you do this??(Answer in 5..4..(scroll down please))


Algorithm

There are three main things that we need to do in this problem,

Separating the two lists/finding a medium

Reversing the second list

Merging the two lists together alternatively

first.next -> second second.next -> tmp1

first -> temp1 second -> temp2

Code

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
 
class Solution {
 
    public void reorderList(ListNode head) {
        
        //Find middle of list using a slow and fast pointer approach
        ListNode slow = head;
        ListNode fast = head.next;
        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
        }
 
        //Reverse the second half of the list using a tmp variable
        ListNode second = slow.next;
        ListNode prev = slow.next = null;
        while (second != null) {
            ListNode tmp = second.next;
            second.next = prev;
            prev = second;
            second = tmp;
        }
 
        //Re-assign the pointers to match the pattern
        ListNode first = head;
        second = prev;
        while (second != null) {
            ListNode tmp1 = first.next;
            ListNode tmp2 = second.next;
            first.next = second;
            second.next = tmp1;
            first = tmp1;
            second = tmp2;
        }
    }
}