LC 1367. Linked List in Binary Tree (KMP)
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: bool isSubPath(ListNode* head, TreeNode* root) { vector<int> arr; while(head!=NULL){ arr.push_back(head->val); head=head->next; } int n=arr.size(); vector<int> table(n); int len=0; for(int i=1;i<n;){ if(arr[i]==arr[len]){ len++; table[i++]=len; }else{ if(len==0){ table[i++]=0; }else{ len=table[len-1]; } } } return helper(table,root,arr,0); } bool helper(vector<int>& table, TreeNode* root, vector<int>& arr, int idx){ if(idx==arr.size()) return true; if(root==NULL) return false; if(root->val==arr[idx]){ return helper(table,root->left,arr,idx+1) || helper(table,root->right,arr,idx+1); } while(idx>0){ idx=table[idx-1]; if(root->val==arr[idx]){ return helper(table,root->left,arr,idx+1) || helper(table,root->right,arr,idx+1); } } return helper(table,root->left,arr,0) || helper(table,root->right,arr,0); } };