26、回文链表
访问
本文共578字。
回顾:[3.24]
题目描述
给你一个单链表的头节点 head
,请你判断该链表是否为回文链表。如果是,返回 true
;否则,返回 false
。
1 | 输入:head = [1,2,2,1] |
我的思路:构建一个新链表,存放翻转后的链表;判断两者是否相等,相等返回True
方法1、转数组,双指针
执行用时: ms
时间复杂度:O(n)
链表赋值给数组,O(n)。回文判断是否相等执行了O(n/2),即还是O(n)。总的为O(2n),所以最终就是O(n)。
空间复杂度:O(n)
使用了一个大小为n的数组存放。
思路总结:
1、复制链表的值给数组
2、双指针,一前一后,向中间遍历,判断是否相等。知道两个指针相遇。
注意:
1 | # Definition for singly-linked list. |
方法2、快慢指针
执行用时:772 ms, 在所有 Python3 提交中击败了19.81%的用户
内存消耗:40.3 MB, 在所有 Python3 提交中击败了79.00%的用户
时间复杂度:O(n),其中 n 指的是链表的大小。
空间复杂度:O(1)。我们只会修改原本链表中节点的指向,而在堆栈上的堆栈帧不超过 O(1)。
思路总结:1、找到链表的中间值(利用快慢指针);2、反转后半链表;3、对比前后链表是否相同,相同返回True。
注意:这里会改变原来的链表
1 | # Definition for singly-linked list. |