LeetCode链表(不断更新)

234. Palindrome Linked List

题意:判断链表是否是回文串

思路:
方法有三种,方法一空间复杂度O(n),方法二O(n/2),方法三O(1),三种时间复杂度都是O(n)。
方法一:遍历链表将节点依次压入一个栈中,弹出栈时依次从链表头开始对比,都一样则说明链表是回文串,有一个不一样的就不是。
方法二:使用快慢两个指针从头遍历链表,快指针一次遍历两个节点,慢指针一次遍历一个节点并弹入栈中。当快指针遇到结尾时慢指针恰好处在中间节点上(如果是偶数个节点则处在中间偏前面的节点上),此时慢指针依然向后遍历,同时将栈中节点弹出依次和慢指针遍历的节点对比,一致则为回文串。
方法三:找到中间节点的部分和方法二相同,之后将后一半的节点反转,用两个指针分别从链表的最左边和最右边开始对比,向中间节点靠近,直到汇合在中间节点为止都一样的话则为回文串。

/**
 * 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==NULL) return true;
        if(head->next==NULL) return true;
        ListNode* slow=head;
        ListNode* high=head;
        while(high->next!=NULL&&high->next->next!=NULL)
        {
            slow=slow->next;
            high=high->next;
            high=high->next;
        }
        ListNode* medium = slow;
        ListNode* pre = NULL;
        while (slow) {
            ListNode* next = slow -> next;
            slow -> next = pre;
            pre = slow;
            slow = next;
        }
        medium->next=NULL;
        while(pre!=NULL&&head!=NULL)
        {
            if(pre->val!=head->val)
                return false;
            pre=pre->next;
            head=head->next;
        }
        return true;
    }
};


141. Linked List Cycle

题意:判断链表是否有环
思路:
方法一:哈希表判断是否有节点重复,空间复杂度O(n);
方法二:快慢指针遍历,如果快指针遇到NULL,则不存在环;若快慢指针相遇,则有环。空间复杂度O(1)。


142. Linked List Cycle II

题意:判断链表是否有环并返回入环节点
思路:
快慢指针相遇时,令快指针指向链表头开始遍历,一次遍历一个节点,慢指针依然从相遇的地方继续以原速度遍历,两个指针相遇的地方即是入环的地方。


109. Convert Sorted List to Binary Search Tree

题意:将升序链表转化为一棵平衡的二叉搜索树
思路:
找到链表中间的节点赋值给二叉树根节点,然后递归处理左右两半边的链表值,左半边的中间节点赋给二叉树根节点的左孩子,右半边的中间节点赋给二叉树的右孩子,以这种方式不断递归下去直到处理完所有链表节点。

/*some error exists in the code*/
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    void trans(ListNode* head,TreeNode** ans) {
        TreeNode* ans1=*ans;
        if(head->next==NULL) 
        {
            ans1 = new TreeNode( head->val );
            return ;
        }

        ListNode* slow=head;
        ListNode* fast=head;

        while(fast->next!=NULL&&fast->next->next!=NULL) 
        {
            slow=slow->next;
            fast=fast->next;
            fast=fast->next;
        }

        ListNode* medium = slow->next;
        ans1 = new TreeNode( slow->val );
        slow->next=NULL;
        slow=slow->next;
        trans(head,&ans1->left);
        trans(medium,&ans1->right);
    }

    TreeNode* sortedListToBST(ListNode* head)
    {
        TreeNode* root=NULL;
        if(head==NULL) return root;
        trans(head,&root);
        return root;
    }
};


147. Insertion Sort List

题意:用插入排序法使一个链表变的有序
思路:
做法基本和用插入排序法使数组有序一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值