I am not sure if this has been answered, but this is how I handle the situation you describe.
In the above, the right side of the parallel branch handles when the flow times out. I set a variable for the task outcome, but you can just delete the task from Dataverse if preferred. Just be sure the first action on the right side only triggers if the approval times out.
Configure the Delete a row from Dataverse action as follows:
Note: if you use the separate Create an approval and Wait for an approval action like I do, be sure that the Approval ID is coming from the Create an approval action.
To handle a cancellation, I use the default case in the switch to check for this.
For the Get a row by ID, point it to the Approvals table and for the Row ID, choose Approval ID from the dynamic content, again ensuring it is the one from the Create an approval action:
In the condition, check of the Status Response Code from the Get a row action is equal to 1923500006, which indicates the task was cancelled:
Then do what you want for the cancellation. In my experience, if someone cancels an approval task, the assignee is notified that it has been cancelled. If that is not happening, I suppose you could delete it like when the approval times out.