Leetcode[143] Reorder List
11 Nov 2015###Task1 Given a singly linked list L: L0→L1→…→Ln-1→Ln, reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…
You must do this in-place without altering the nodes’ values.
For example, Given {1,2,3,4}, reorder it to {1,4,2,3}. ###Python
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def reorderList(self, head):
"""
:type head: ListNode
:rtype: void Do not return anything, modify head in-place instead.
"""
if not head:
return
mid = self.findMid(head)
second = mid.next
mid.next = None
secondR = self.reverse(second)
newHead = self.merge(head, secondR)
return newHead
def merge(self, first, second):
dummy = ListNode(0)
turn = True
while first and second:
if turn:
dummy.next = first
dummy = dummy.next
first = first.next
turn = not turn
else:
dummy.next = second
dummy = dummy.next
second = second.next
turn = not turn
if first:
dummy.next = first
dummy = dummy.next
first = first.next
if second:
dummy.next = second
dummy = dummy.next
second = second.next
return dummy.next
def reverse(self, head):
prev = None
while head:
temp = head.next
head.next = prev
prev = head
head = temp
return prev
def findMid(self, head):
slow = head
fast = head.next
while fast and fast.next:
prev = slow
slow = slow.next
fast = fast.next.next
return slow
###Java
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode findMiddle(ListNode head) {
ListNode slow = head;
ListNode fast = head.next;
while (fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
}
return slow;
}
public ListNode reverse(ListNode head) {
ListNode prev = null;
while (head != null) {
ListNode temp = head.next;
head.next = prev;
prev = head;
head = temp;
}
return prev;
}
public void reorderList(ListNode head) {
if (head == null || head.next == null) {
return;
}
ListNode dummy = new ListNode(0);
ListNode parser = dummy;
ListNode mid = findMiddle(head);
ListNode reversed = reverse(mid.next);
mid.next = null;
boolean choice = true;
while (head != null && reversed != null) {
if (choice) {
parser.next = head;
head = head.next;
choice = !choice;
} else {
parser.next = reversed;
reversed = reversed.next;
choice = !choice;
}
parser = parser.next;
}
if (head != null) {
parser.next = head;
}
if (reversed != null) {
parser.next = reversed;
}
return ;
}
}
###Points
- O(n)
- PAT: the difference between find mid and find the one before mid. (the latter is used to divide list into three parts…)
- When merge: while + two if format..