LeetCode OJ Linked List: 24题、148题和61题

题外话:最近打算做一些LeetCode OJ上面的练习题了,当然很多前辈都已经写过若干解题报告了。坦白说,也正是因为前辈们的贡献,才让我们学习到了很多知识。所以,我一直都在犹豫到底要不要写解题报告多此一举呢?当然,我水平很渣啊。我觉得虽然,有很多很好的解题报告可参考了,但是自己对待这件事的态度又是另外一回事,记录下来,完全是提醒自己这段时间是有计划的,是要做题的。

24题:Swap Nodes in Pairs

题目分析:链表长度为奇数时,最后一个节点不用再调整啦。当然了,不能改变节点的值,否则,你还玩不玩了?

class Solution
{
public:
    ListNode *swapPairs(ListNode *head)
    {
        if (head == NULL || head->next == NULL)
        {
            return head;
        }

        ListNode tmpNode(-1);

        ListNode *pre = &tmpNode, *cur, *next;

        for (cur = head, next = cur->next; next; pre = cur, cur = cur->next, next = cur ? cur->next : NULL)
        {
            pre->next = next;
            cur->next = next->next;
            next->next = cur;
        }

        return tmpNode.next;
    }
};

148题:Sort List

题目分析:从时间性能上看,貌似不能用快速排序,快速排序的期望性能是nlogn的,所以归并排序应该是比较容易想到的。

class Solution
{
public:
    ListNode* MergeList(ListNode *lList, ListNode *rList)
    {
        ListNode tmpNode(-1);
        ListNode *tmp = &tmpNode;

        while (lList != NULL && rList != NULL)
        {
            if (lList->val < rList->val)
            {
                tmp->next = lList;
                lList = lList->next;
            }
            else
            {
                tmp->next = rList;
                rList = rList->next;
            }

            tmp = tmp->next;
        }

        if (lList != NULL)
        {
            tmp->next = lList;
        }

        if (rList != NULL)
        {
            tmp->next = rList;
        }

        return tmpNode.next;
    }

    ListNode* sortList(ListNode *head)
    {
        if (head == NULL || head->next == NULL)
        {
            return head;
        }

        //利用快慢指针找到中间位置
        ListNode *fast = head, *slow = head;
        while (fast->next != NULL && fast->next->next != NULL)
        {
            fast = fast->next->next;
            slow = slow->next;
        }

        //分割为两个链表
        fast = slow->next;
        slow->next = NULL;

        ListNode *lList = sortList(head);
        ListNode *rList = sortList(fast);

        return MergeList(lList, rList);
    }
};

61题:Rotate List

题目分析:我只能说千万不要很实在地移动k个节点,就像上面的例子,k=5,k=10,...这不都是与没移动一个效果么。另外,那个不用一步一移,可以最后找到合适位置断开即可。

class Solution {
public:
    ListNode* rotateRight(ListNode *head, int k)
    {
        if (head == NULL || head->next == NULL)
        {
            return head;
        }

        //计算长度
        ListNode *p = head;
        int lenList = 1;
        while (p->next != NULL)
        {
            p = p->next;
            lenList += 1;
        }

        p->next = head;
        int step = lenList - k % lenList;
        for (int i = 0; i < step; ++i)
        {
            p = p->next;
        }

        //断开
        head = p->next;
        p->next = NULL;

        return head;
    }
};

时间: 2024-10-08 10:29:02

LeetCode OJ Linked List: 24题、148题和61题的相关文章

LeetCode OJ Linked List: 138题、109题和191题

138题:Copy List with Random Pointer 题目分析: 本题思路1:第一步,你需要遍历一下链表,对于每个结点,你都new出一个连接在其后面.第二步,调整random指针.第三步,把复制的链表与原链表断开.时间复杂度O(N),空间复杂度O(1). 本题思路2:第一步,仍需要遍历一下链表,对于每个结点都new出一个节点,但不连接在其后面,把这种旧节点到新结点的映射关系,存储在map中.第二步,调整random指针.时间复杂度O(N),空间复杂度O(N). 本题思路3:第一步

LeetCode OJ - Linked List Cycle II

题目: Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Follow up: Can you solve it without using extra space? 解题思路: 设置两个指针slow和fast,从head开始,slow一次一步,fast一次两步,如果fast能再次追上slow则有圈. 设slow走了n步,则fast走了2*n步,设圈长度m

LeetCode OJ - Linked List Cycle

题目: Given a linked list, determine if it has a cycle in it. Follow up: Can you solve it without using extra space? 解题思路: 使用快慢指针,快指针每次走两步,慢指针每次走一步,若快指针能追上慢指针,则表明有圈. 代码如下: /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNo

LeetCode OJ - Reverse Linked List II

题目: Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Given 1->2->3->4->5->NULL, m = 2 and n = 4, return 1->4->3->2->5->NULL. Note:Given m, n satisfy the following condition:1 ≤ m ≤ n ≤ l

nyist oj 36 最长公共子序列 (动态规划基础题)

最长公共子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列. tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列. 输入 第一行给出一个整数N(0<N<100)表示待测数据组数 接

nyist oj 17 单调递增最长子序列 (动态规划经典题)

单调递增最长子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 求一个字符串的最长递增子序列的长度 如:dabdbf最长递增子序列就是abdf,长度为4 输入 第一行一个整数0<n<20,表示有n个字符串要处理 随后的n行,每行有一个字符串,该字符串的长度不会超过10000 输出 输出字符串的最长递增子序列的长度 样例输入 3 aaa ababc abklmncdefg 样例输出 1 3 7 来源 经典题目 动态规划的经典题目:好像还有好几种解法,我现在研究的

LeetCode OJ - Word Ladder 2

我发现在leetcode上做题,当我出现TLE问题时,往往是代码有漏洞,有些条件没有考虑到,这道题又验证了我这一想法. 这道题是在上一道的基础上进一步把所有可能得转换序列给出. 同样的先是BFS,与此同时需要一个hashMap记录下每个节点,和他所有父节点的对应关系,然后通过DFS,回溯所有可能的路径. 下面是AC代码. 1 /** 2 * Given two words (start and end), and a dictionary, find all shortest transform

LeetCode OJ——练习笔记(1)Evaluate Reverse Polish Notation

院招终于开始了,然后期待与兴奋过后却是面临着笔试一次又一次的失败,然后开始留意到LeetCode. 也想自己去体验一下诸多大牛通向无限coding路上都攻克过的一关. 话不多说,贴出原题: Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, *, /. Each operand may be an integer or another expres

LeetCode: Reverse Linked List

LeetCode: Reverse Linked List Reverse a linked list from position m to n. Do it in-place and in one-pass. For example: Given 1->2->3->4->5->NULL, m = 2 and n = 4, return 1->4->3->2->5->NULL. Note: Given m, n satisfy the follo