https://oj.leetcode.com/problems/convert-sorted-list-to-binary-search-tree/
http://fisherlei.blogspot.com/2013/01/leetcode-convert-sorted-list-to-binary.html
http://blog.csdn.net/worldwindjp/article/details/39722643
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; next = null; } * } */ /** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public TreeNode sortedListToBST(ListNode head) { // Option A: TreeNode root = buildTop2Buttom(head, null); return root; } ////////////////////////// // Option A: Top to bottom // // Unlike sorted array, no random access. // But we still can follow the same strategy that: // Given head, find the mid. // O(n log n) private TreeNode buildTop2Buttom(ListNode start, ListNode end) { if (start == null || start == end) return null; if (start.next == end) return new TreeNode(start.val); ListNode mid = findMid(start, end); TreeNode root = new TreeNode(mid.val); root.left = buildTop2Buttom(start, mid); root.right = buildTop2Buttom(mid.next, end); return root; } // Find the mid node from 'start'(inclusive) to 'end'(exclusive) private ListNode findMid(ListNode start, ListNode end) { ListNode toReturn = null; ListNode s1 = start; ListNode s2 = start; while (s2 != null && s2 != end) { toReturn = s1; s1 = s1.next; s2 = s2.next; if (s2 == null || s2 == end) s2 = null; else s2 = s2.next; } return toReturn; } }