109. Convert Sorted List to Balanced BST

Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.

Example

               2
1->2->3  =>   / \
             1   3

分析:
非常简单,用递归即可。需要注意返回mid node的时候,要把整个list分成两半。

public class Solution {
    public TreeNode sortedListToBST(ListNode head) {
        return helper(head, null);
    }

    public TreeNode helper(ListNode head, ListNode tail) {
        ListNode mid = middle(head, tail);
        if (mid == null) return null;
        TreeNode root = new TreeNode(mid.val);
        root.right = helper(mid.next, tail);
        root.left = helper(head, mid);
        return root;
    }

    private ListNode middle(ListNode head, ListNode tail) {
        if (head == tail) return null;
        ListNode slow = head, quick = head;
        while (quick != tail && quick.next != tail) {
            slow = slow.next;
            quick = quick.next.next;
        }
        return slow;
    }
}

 

 1 /**
 2  * Definition for singly-linked list.
 3  * public class ListNode {
 4  *     int val;
 5  *     ListNode next;
 6  *     ListNode(int x) { val = x; }
 7  * }
 8  */
 9 /**
10  * Definition for a binary tree node.
11  * public class TreeNode {
12  *     int val;
13  *     TreeNode left;
14  *     TreeNode right;
15  *     TreeNode(int x) { val = x; }
16  * }
17  */
18 public class Solution {
19     public TreeNode sortedListToBST(ListNode head) {
20         if (head == null) return null;
21         ListNode mid = middle(head);
22         TreeNode root = new TreeNode(mid.val);
23         root.right = sortedListToBST(mid.next);
24         if (mid != head) {
25             root.left = sortedListToBST(head);
26         }
27         return root;
28     }
29     
30     private ListNode middle(ListNode head) {
31         if (head == null || head.next == null) return head;
32         ListNode pre = null, slow = head, quick = head;
33         
34         while(quick.next != null && quick.next.next != null) {
35             pre = slow;
36             slow = slow.next;
37             quick = quick.next.next;
38         }
39         
40         if (pre != null) {
41             pre.next = null;  // cut the list into halves.
42         }
43         return slow;
44     }
45 }

 

posted @ 2016-07-03 06:00  北叶青藤  阅读(243)  评论(0编辑  收藏  举报