每次二分法找中点,此点为root,左半部分为左子树,右半部分为右子树。
public class Solution {
//Time: O(nlogn)
public TreeNode sortedListToBST(ListNode head) {
if (head == null) {
return null;
}
if (head.next == null || head.next.next == null) {
TreeNode root = new TreeNode(head.val);
if (head.next != null) {
root.right = new TreeNode(head.next.val);
}
return root;
}
ListNode midPre = findMidPre(head);
ListNode mid = midPre.next;
TreeNode root = new TreeNode(mid.val);
midPre.next = null;
root.left = sortedListToBST(head);
root.right = sortedListToBST(mid.next);
return root;
}
private ListNode findMidPre(ListNode head) {
ListNode dummy = new ListNode(0);
dummy.next = head;
head = dummy;
ListNode fast = head;
ListNode slow = head;
while (fast.next != null && fast.next.next != null) {
fast = fast.next.next;
slow = slow.next;
}
return slow;
}
}
No comments:
Post a Comment