看问题,首先想到的解决办法如下:
(1)单独设计一个函数可以,计算出有序链表的中间节点的前驱节点。后续会看到原因,这个函数进入的有序链表长度长度至少有2个节点;
(2)回到原来需要设计的函数:
a. 如果没有节点返回null,如果是只有一个节点,将这个节点制造成树节点返回;由于这个原因,输入到寻找前驱节点的问题的有序链表至少2个节点;
b. 找到前驱节点,找到中间节点,完成赋值。
c. 在前驱节点和中间节点之间进行切段;为了实现分治递归的用途;
d. 递归寻找左节点,右节点;返回根节点;
其中:单独设计函数非常值得一提,因为:2/2 = 1, 3/2 = 1; 4/2 = 2, 5/2 = 2; ~~~ 在进行整数除法的时候;
所以,寻找前驱函数的循环设计,需要讲所有情况规约成 偶,奇 一组的样子,而且,由于起点是2,所以每次都是偶在前面,奇在后面;
public class Solution { ListNode getLeftNodeFromList(ListNode head){//默认就至少有2个链表节点 ListNode next = head.next; ListNode index = head.next; ListNode pre = head; while(next != null) { next = next.next; if(next == null) break; next = next.next; if(next == null) break; pre = pre.next; index = pre.next; } return pre; } public TreeNode sortedListToBST(ListNode head) { if(head == null) return null; if(head.next == null) return new TreeNode(head.val); ListNode left = getLeftNodeFromList(head); ListNode mid = left.next; left.next = null; TreeNode root = new TreeNode(mid.val); root.left = sortedListToBST(head); root.right = sortedListToBST(mid.next); return root; } }
当然,这个办法不是最好的,稍后会讨论最优解,这个解由于利用递归,时间复杂度为:O(N*lgN)
时间: 2024-11-20 19:07:57