leetcode刷题之判断链表是否是回文链表

本文记录了在LeetCode中解决判断回文链表问题的方法,通过双指针找到链表中点,反转后半部分链表,再与前半部分比对,实现O(n)时间复杂度和O(1)空间复杂度的解决方案。
摘要由CSDN通过智能技术生成

最近在刷leetcode的题目,遇到了一个题目,百思不得其解,后来终于明白,因此写篇博客记录一下。
首先题目是这样的:
Given a singly linked list, determine if it is a palindrome.
Follow up:
Could you do it in O(n) time and O(1) space?
即给定一个链表,判断链表是否是回环链表。链表的每个节点都存有一个值,如-1 > 1 >1 >-1,即为回文链表。难点在于时间复杂度为O(n),空间复杂度为O(1).
    
 解题思路如下:
1 首先用一个快指针,一个慢指针来遍历链表。快指针每次走两步,慢指针每次走一步。等到快指针遍历完链表,慢指针就正好停留在链表的中央。
2 将链表的后半部分进行反转。
3 将链表的前半部分与后半部分逐个比对。若都相同,则为回文链表,否则不是。
链表遍历的时间复杂度大约为 n/2。反转的时间复杂度为n/2。逐个比对的复杂度为n/2,所以总体的时间复杂度为O(n).而其中用于暂存的节点只有两个。因此空间复杂度为O(1)。

代码如下
`
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode * reverse( struct ListNode * head )
{
struct ListNode * p = head ;
struct ListNode *

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值