力扣hot100——234.回文链表

题目链接: 234. 回文链表 - 力扣(LeetCode)

将链表元素放入数组进行判断

数组查找效率较高,而增删效率低;与之相反,链表增删效率低,查找效率慢。而判断回文需要用到大量的查找操作,因此将链表元素放入数组,在数组中用双指针进行操作。

class Solution {
public:
    bool isPalindrome(ListNode* head) {
        vector<int> num;
        ListNode* cur=head;
        while(cur){
	        //在数组中存放链表元素
            num.push_back(cur->val);
            cur=cur->next;
        }
        //根据回文的性质,一前一后进行比较
        for(int i=0,j=num.size()-1;i<j;i++,j--){
            if(num[i]!=num[j]) return false;
        }
        return true;
    }
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(n) 使用数组存放链表元素

反转链表后半部分加快慢指针

先找到中点,将链表的后半部分反转,然后将链表的前半部分和后半部分依次比较

class Solution {
public:
	//找到链表前半部分的最后一个元素
    ListNode* half(ListNode* head){
        ListNode* slow=head,*fast=head;
        while(fast->next!=nullptr&&fast->next->next!=nullptr){
            slow=slow->next;
            fast=fast->next->next;
        }
        return slow;
    }
    //反转链表
    ListNode* reverse(ListNode* head){
        ListNode* cur=head,*pre=nullptr;
        while(cur){
            ListNode* temp=cur->next;
            cur->next=pre;
            pre=cur;
            cur=temp;
        }
        return pre;
    }
    bool isPalindrome(ListNode* head) {
        ListNode* halfp=half(head);
        ListNode* halfnext=halfp->next,*cur=head;
        ListNode* halfreverse=reverse(halfnext);
        while(halfreverse!=nullptr){
            if(cur->val!=halfreverse->val) return false;
            cur=cur->next;
            halfreverse=halfreverse->next;
        }
        //恢复链表
        halfp->next=reverse(halfreverse);
        return true;
    }
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值