234. 回文链表
234. 回文链表
题目描述:
请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
思路:
第一种简单的思路是遍历一遍,将数据保存在数组里面,然后从两边开始遍历
第二种是进阶算法,用快慢指针,一个指针一次走两步,一个一次走一步,然后快指针走完慢指针刚刚走到一半,将后半链表逆置,然后前半链表和后半比较
代码:
func isPalindrome(head *ListNode) bool {
if head.Next==nil||head==nil{
return true
}
var pre *ListNode=nil
fast,slow :=head,head
for fast!=nil&&fast.Next!=nil{
fast=fast.Next.Next
pre=slow
slow=slow.Next
}
pre.Next=nil
//翻转链表
var head2 *ListNode=nil
for(slow!=nil){
tmp:=slow.Next
slow.Next=head2
head2=slow
slow=tmp
}
for head!=nil{
if head2.Val!=head.Val{
return false
}else{
head=head.Next
head2=head2.Next
}
}
return true
}
代码效率:
执行用时:172 ms, 在所有 Go 提交中击败了23.75%的用户
内存消耗:9.3 MB, 在所有 Go 提交中击败了29.47%的用户
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!