该题不同于108的一个难点是,链表无法采用下标访问的方式来获取元素。
我的初始思路是,定义一个数组,将链表的值都push_back到vector里面,然后套用108的方法进行做。这样的话额外空间复杂度是O(n),比较费空间,且思路无亮点。
在看过网上的一些思路后,发现牵扯一个链表常考的知识点,即快慢指针。这里快慢指针的一个用法是:可以通过快慢指针找到一个链表的中间节点。注意,快慢指针初始化时可以有不统一的方式,比如可以定义快慢指针都指向初始头指针;或者可以让快指针先走一步,慢指针依然是初始化为头节点。具体使用时候的选择要看题目的一些限制,又或者可以通用。(该题因为要在找到中间节点时进行断链的操作,所以最好采用快指针初始化先走,慢指针保持头节点)。
使用快慢指针要注意的一点是,快指针因为走两步而造成的编译时可能出现的:
member access within null pointer of type 'struct ListNode'问题。
对于这个题,解决这个指针问题是通过加一个判断条件:
if(head->next==NULL) return (new TreeNode(head->val)); 至于为什么不加(head0->next->next)的判断条件,还不是很懂???
还要注意快慢指针的while判决条件:
ast!=NULL&&fast->next!=NULL
解答链接:
https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree/description/