前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【leetcode刷题】T109-回文链表

【leetcode刷题】T109-回文链表

作者头像
木又AI帮
修改2019-07-18 10:32:42
2790
修改2019-07-18 10:32:42
举报
文章被收录于专栏:木又AI帮木又AI帮

【题目】

请判断一个链表是否为回文链表。

代码语言:javascript
复制
示例 :
输入: ->
输出: false
示例 :
输入: ->->->
输出: true

进阶: 你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

【思路】

和【T108-重排链表】类似,将链表分为前后两部分,再将后半部分翻转,最后依次对比两个小链表的元素大小即可。

【代码】

python版本

代码语言:javascript
复制
# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def isPalindrome(self, head):
        """
        :type head: ListNode
        :rtype: bool
        """
        if not head or not head.next:
            return True
        # 链表分为前后两部分
        p = head
        q = head
        while q.next and q.next.next:
            p = p.next
            q = q.next.next

        # 后半部分的链表翻转
        head2 = p
        q = p.next
        r = p.next
        while q:
            r = q.next
            q.next = p
            p = q
            q = r

        head2.next = None
        head2 = p

        # 判断是否相等
        p = head
        q = head2
        while p and q:
            if p.val != q.val:
                return False
            p = p.next
            q = q.next
        return True

C++版本

代码语言:javascript
复制
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    bool isPalindrome(ListNode* head) {
        // 分成前后两部分
        if(!head || !head->next)
            return true;
        ListNode* p = head;
        ListNode* q = head;
        while(q->next && q->next->next){
            p = p->next;
            q = q->next->next;
        }
        // 后部分翻转
        q = p->next;
        ListNode* r = q;
        ListNode* head2 = p;
        while(q){
            r = q->next;
            q->next = p;
            p = q;
            q = r;
        }
        head2->next = NULL;
        head2 = p;

        // 判断是否相同
        p = head;
        q = head2;
        while(p && q){
            if(p->val != q->val)
                return false;
            p = p->next;
            q = q->next;
        }
        return true;
    }
};
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 木又AI帮 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档