LeetCode234回文链表

LeetCode234回文链表

给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。
输入:head = [1,2,2,1]
输出:true
输入:head = [1,2]
输出:false

思想

时间复杂度O(n),空间复杂度O(1)
设中间元素为mid
第一遍遍历计算链表的size,
第二遍遍历转置从链表开头到中间位置的元素,
第三遍遍历,一一对比链表开头与mid后的元素
(其实第一遍遍历应该可以和第二遍合并)

代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
 class Tools {
public:
     template<typename T>
     void vector_1_show(vector<T> num) {

         for (auto a : num)
             cout << a << " ";
         cout << endl;
     }
     template<typename T>
     void vector_2_show(vector<vector<T>> num) {

         for (auto a : num) {
             for (auto b : a) {
                 cout << b << " ";
             }
             cout << endl;
         }
     }
     int list_size(ListNode* head) {
         if (head == nullptr)
             return 0;
         int size = 1;
         ListNode* p = head;
         while (p->next != nullptr) {
             size++;
             p = p->next;
         }
         return size;
     }
     void show_ListNodes(ListNode* head) {
         ListNode* p = head;
         while (p != nullptr) {

             cout << p->val << " ";
             p = p->next;
         }
         cout << "" << endl;
         return;
     }
     ListNode* create_ListNodes(std::vector<int>& data) {
         if (data.size() == 0)
             return nullptr;
         ListNode* head = new ListNode(data[0]);
         int i = 1;

         ListNode* p = head, * q = head;;

         while (i < data.size()) {
             p->next = new ListNode(data[i++]);   //这个new要回收地址吗
             p = p->next;
         }
         // delete(q);
         return head;
     }

};
class Solution {
public:
    bool isPalindrome(ListNode* head) {
        int size = 0,flag=0,i=1;
        Tools t;
        size = t.list_size(head);
        //cout << "size " << size << endl;
        if (size <= 1)
            return true;
        flag = size / 2 + 1;

        ListNode* mid = head;
        while (i++ < flag) {
            mid = mid->next;
        }
        //cout << "mid" << mid->val << endl;
        ListNode* p = head->next;
        ListNode* tail = head;
        while (p != mid) {
            tail->next = p->next;
            p->next = head;
            head = p;
            p = tail->next;
        }
        if (size % 2 != 0) {
            mid = mid->next;
        }
           
        ListNode* pp = head, * qq = mid;
        while (pp != nullptr && qq != nullptr) {
            //cout << " pp:" << pp->val << " qq:" << qq->val << endl;
            if (qq->val != pp->val) {
                return false;
            }   
            pp = pp->next;
            qq = qq->next;
        }
        return true;
    }
};
  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
根据提供的引用内容,有三种方法可以解决LeetCode上的最长回文子串问题。 方法一是使用扩展中心法优化,即从左向右遍历字符串,找到连续相同字符组成的子串作为扩展中心,然后从该中心向左右扩展,找到最长的回文子串。这个方法的时间复杂度为O(n²)。\[1\] 方法二是直接循环字符串,判断子串是否是回文子串,然后得到最长回文子串。这个方法的时间复杂度为O(n³),效率较低。\[2\] 方法三是双层for循环遍历所有子串可能,然后再对比是否反向和正向是一样的。这个方法的时间复杂度也为O(n³),效率较低。\[3\] 综上所述,方法一是解决LeetCode最长回文子串问题的最优解法。 #### 引用[.reference_title] - *1* [LeetCode_5_最长回文子串](https://blog.csdn.net/qq_38975553/article/details/109222153)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Leetcode-最长回文子串](https://blog.csdn.net/duffon_ze/article/details/86691293)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [LeetCode 第5题:最长回文子串(Python3解法)](https://blog.csdn.net/weixin_43490422/article/details/126479629)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值