刷题记录 leetcode109:根据有序链表构造平衡的二叉查找树

给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。

本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。

 

如果数据存储在数组中,这道题很简单,根据二叉搜索树的性质,数组的中间值应该作为根节点,然后在对数组左半边和右半边递归,但是这道题的难点是数据在链表中,不能直接访问中间位置的数据,可以采取的办法是:创建一个慢指针和一个快指针,慢指针每次移动一格,快指针每次移动两格,那么快指针到链表末端的时候,慢指针就到了中间。另外还需要用一个指针跟踪慢指针,使ptr.next = slow,在每次拿到中间值后,通过ptr.next = null分割链表。

class Solution {
    public TreeNode sortedListToBST(ListNode head) {
        if(head == null)
            return null;
        if (head.next == null) 
            return new TreeNode(head.val);            // 如果链表只有一个节点,premide会指向这个节点,mid会为空,mid.val会报错
        ListNode premid = premid(head);
        ListNode mid = premid.next;
        TreeNode root = new TreeNode(mid.val);
        premid.next = null;                          // 分割链表
        root.left = sortedListToBST(head);
        root.right = sortedListToBST(mid.next);
        return root;
    }
    public ListNode premid(ListNode head){
        ListNode slow = head;
        ListNode pre = head;
        ListNode fast = head;
        while(fast!= null && fast.next != null){
            pre = slow;                               // pre = slow必须放在slow = slow.next前边,用来跟踪slow
            slow = slow.next;
            fast = fast.next.next;
        }
        return pre;
    }
}

 

posted @ 2020-07-19 16:23  嫩西瓜  阅读(281)  评论(0)    收藏  举报