原题网址:https://leetcode.com/problems/convert-sorted-list-to-binary-search-tree/
Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
方法:使用慢指针和快指针。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
private TreeNode sort(ListNode head, ListNode tail) {
if (head == null || head == tail) return null;
if (head.next == tail) return new TreeNode(head.val);
ListNode slow = head;
ListNode fast = head.next;
while (fast != tail && fast.next != tail) {
slow = slow.next;
fast = fast.next.next;
}
TreeNode root = new TreeNode(slow.val);
root.left = sort(head, slow);
root.right = sort(slow.next, tail);
return root;
}
public TreeNode sortedListToBST(ListNode head) {
return sort(head, null);
}
}
另一种实现:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
private TreeNode build(ListNode from, ListNode to) {
if (from == null || from == to) return null;
if (from.next == to) return new TreeNode(from.val);
ListNode slow = from;
ListNode fast = from;
while (fast != null && fast.next != null && fast != to && fast.next != to) {
slow = slow.next;
fast = fast.next.next;
}
TreeNode node = new TreeNode(slow.val);
node.left = build(from, slow);
node.right = build(slow.next, to);
return node;
}
public TreeNode sortedListToBST(ListNode head) {
return build(head, null);
}
}