234-e-Palindrome Linked List

本文介绍了两种链表回文判断的方法:一种使用栈实现,时间复杂度接近O(n),空间复杂度非O(1);另一种采用递归方式,不仅实现了空间O(1),而且巧妙地利用了递归特性。

判断一个链表是否回文。一看到判断回文第一想到就是一头一尾双指针移动,但单链表尾巴回不来啊,于是自然想到了栈。但一时半会想不出怎么保持指针,上网搜了一下搜出了另一种解法也是用了栈,用了一个慢指针遍历一个快指针每次移动2格间接测出了链表长度,但如果加上之后的慢指针遍历判断时间度应该算O(1.5n)吧,而且空间不是O(1)。鉴于该逻辑比较好理解,我也就顺着这逻辑写了,但总觉得不是leet要求的,一定有更好的。没错,stackoverflow有更好的,总体思想跟我开始想法一样,但人歪果仁实现了,我很服。

第一种解法,AC用了12ms,用静态数组模拟栈,因为用的C不想写栈了,空间较大否则过不了会runtime error:

//bool isPalindrome(struct ListNode* head) {
//    bool result = true;
//    int n = 10240;
//    int stack[n];
//    memset(stack, 0, sizeof(int) * n);
//    int sp = 0;
//    
//    struct ListNode myHead = {0, head};
//    struct ListNode *slow = &myHead;
//    struct ListNode *fast = head;
//    
//    while (fast != NULL && fast->next != NULL) {
//        slow = slow->next;
//        stack[sp] = slow->val;
//        fast = fast->next->next;
//        sp++;
//    }
//    slow = slow->next; //由于做了个头结点,所以slow要恒下移一位
//    if (fast != NULL)
//        stack[sp] = slow->val; //fast不为空说明为奇数,则数据栈入数据;否则栈指针要退1指向当前有效数据
//    else
//        sp--;
//    while (slow != NULL) {
//        if (slow->val != stack[sp]) {
//            result = false;
//            break;
//        }
//        slow = slow->next;
//        sp--;
//    }
//    
//    return result;
//}

下面是歪果仁的递归解法,利用了递归相当于栈的特点,而且空间为O(1),很好的解释了leet上算法和解法的有趣,用了递归稍慢,AC要16ms:

int fix_isPalindrome(struct ListNode **root, struct ListNode *head)
{
    if(!head)
        return 1;
    else
    {
        int res=fix_isPalindrome(root,head->next);
        
        if(res==0)
            return 0;
        int r=(*root)->val==head->val;
        *root=(*root)->next;
        return r;
    }
}
bool isPalindrome(struct ListNode* head) {
    bool result = false;
    result = fix_isPalindrome(&head, head);
    return result;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值