暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

LeetCode234-判断链表是否对称

后端魔法书 2021-06-25
1259

题意

给一个单链表,判断其是否对称。比如1->2->2->1是对称的链表,而1->2不对称。


暴力解法

判断数组是否对称很简单,使用两个指针分别指向首尾,朝着中间遍历即可。所以第一个想法是遍历链表,把链表中的元素保存在数据组,再判断数组是否对称。时间复杂度O(n),空间复杂度O(n)。


O(1)空间复杂度的解法

对称链表的后半部分反转后和前半部分是相同的,而找到链表的后半部分以及反转链表的空间复杂度都是O(1),时间复杂度是O(n),因此我们得到了一个常量空间复杂度的算法。

  1. 使用快慢指针找到链表的中点

  2. 反转链表的后半部分

  3. 再比较前半部分和后半部分是否相等


代码

    /**
    * 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 Solution {
    public:
    bool isPalindrome(ListNode* head) {
    ListNode* slow = head, *fast = head;
    while (fast && fast->next) {
    fast = fast->next->next;
    slow = slow->next;
    }
    if (fast)
    slow = slow->next;

    slow = reverse(slow);

    while (slow) {
    if (slow->val != head->val)
    return false;
    slow = slow->next;
    head = head->next;
    }
    return true;
    }

    ListNode* reverse(ListNode* root) {
    ListNode* prev = nullptr;
    while (root) {
    ListNode* next = root->next;
    root->next = prev;
    prev = root;
    root = next;
    }
    return prev;
    }
    };


    文章转载自后端魔法书,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论