刷题记录 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; } }
浙公网安备 33010602011771号