怒刷leetcode题目(3)226,83,142,86

226 Invert Binary Tree 36.2% Easy

Invert a binary tree.

     4
   /     2     7
 / \   / 1   3 6   9

to

     4
   /     7     2
 / \   / 9   6 3   1

对的,这就是前阵子homebrew大神面试没做出来的那道题

其实这道题并不难…也许只是大神不屑于做这样的题目罢了…

照样的,我们发现以下规律

所有的左子树和右子树交换,除非到了结点(树叶)

主需要交换两棵子树然后对子树递归就好了

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
struct TreeNode* invertTree(struct TreeNode* root) {
    if(root == NULL){
        return NULL;
    }
    struct TreeNode* temp = root->left;
    root->left=root->right;
    root->right = temp;
    invertTree(root->left);
    invertTree(root->right);
    return root;
}
83 Remove Duplicates from Sorted List 34.4% Easy

Given a sorted linked list, delete all duplicates such that each element appear only once.

For example,

Given 1->1->2, return 1->2.

Given 1->1->2->3->3, return 1->2->3.

太简单了…都不知道说什么好了

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* deleteDuplicates(struct ListNode* head) {
    if(head == NULL){
        return false;
    }
    struct ListNode* pointer = head;
    while(pointer->next!=NULL){
        if(pointer->val==pointer->next->val){
            pointer->next = pointer->next->next;
        }else{
            pointer= pointer->next;
        }
    }
    return head;
}
142 Linked List Cycle II 31.4% Medium

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?

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *detectCycle(struct ListNode *head) {
    if(head==NULL){
        return false;
    }
    struct ListNode *slow = head;
    struct ListNode *fast = head;
    while(fast!=NULL && fast->next!=NULL){
        slow = slow->next;
        fast = fast->next->next;
        if(slow == fast){
            slow = head;
            while(slow!=fast){
                slow = slow->next;
                fast = fast->next;
            }
            return slow;
        }
    }
    return false;
}

这道题目跟141(上一篇博客中提及的)很类似,都是找出环

142实际是升级版,要找出环的入口

同样是使用快慢指针,大家可以在纸上画一下,写一下

如果有环,第一次相遇的时候,慢指针走了L+X的路程(L是起点到环入口的距离,X是入口到相遇时走过的距离,距离有可能比一圈的长度大)

快指针想当然的走了(L+X)*2的路程(其实不一定是2,只不过2比较好计算而已)

而且!!!快指针走过的距离是L+X+m*R(L、X同上,毕竟相遇点相同,m代表的是走过的圈数,R代表圈的长度)

也就是L+X=m*R

所以L=m*R-X

这时候,我们将慢指针回到起点,快指针的每一步的距离变成1

我们可以知道,慢指针和快指针相遇的时候

慢指针走了L,快指针走了m*R+m*R+X-X=2*m*R,也是在环的入口

所以他们再次相遇的节点就是环的入口

86 Partition List 27.4% Medium

Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.

You should preserve the original relative order of the nodes in each of the two partitions.

For example,

Given 1->4->3->2->5->2 and x = 3,

return 1->2->2->4->3->5.

遍历一次,将节点放进相应的链表,最后相连就好了,注意细节比较重要

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* partition(struct ListNode* head, int x) {
    if(head==NULL){
        return NULL;
    }
    if(head->next==NULL){
        return head;
    }
    struct ListNode* less_list = NULL;
    struct ListNode* less_list_head = NULL;
    struct ListNode* greater_list = NULL;
    struct ListNode* greater_list_head = NULL;
    struct ListNode* pointer = head;
    while(head!=NULL){
        struct ListNode* next = head->next;
        head->next = NULL;
        if(head->val<x){
            if(less_list_head==NULL){
                less_list_head=head;
                less_list=head;
            }else{
                less_list->next = head;
                less_list=less_list->next;
            }
        }else{
            if(greater_list_head==NULL){
                greater_list_head=head;
                greater_list=head;
            }else{
                greater_list->next = head;
                greater_list=greater_list->next;
            }
        }
        head=next;
    }
    if(less_list_head==NULL){
        return greater_list_head;
    }

    less_list->next=greater_list_head;
    return less_list_head;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 04:49:57

怒刷leetcode题目(3)226,83,142,86的相关文章

怒刷leetcode的题目(1)237、104、136、100

https://leetcode.com/problemset/algorithms/上面的题目,每天做几道题目,大体从准确率高至低做下去 编程语言为c语言,因为跑的最快- 237 Delete Node in a Linked List 47.8% Easy Write a function to delete a node (except the tail) in a singly linked list, given only access to that node. Supposed t

用golang刷LeetCode

用golang刷LeetCode 用Go语言刷LeetCode记录,只是为了练习Go语言,能力有限不保证都是最优解,只能在此抛转引玉了. 数据结构和算法 数据结构和算法是程序员的命根子,没了命根子也就没有了尊严. 1. 两数之和 题目描述 力扣(LeetCode)链接 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 示例: 给定 nums

刷LeetCode的正确姿势——第1、125题

最近刷LeetCode比较频繁,就购买了官方的参考电子书 (CleanCodeHandbook),里面有题目的解析和范例源代码,可以省去非常多寻找免费经验分享内容和整理这些资料的时间.惊喜的是,里面的所有源代码都是用java语言写的. 接下来的一段时间里,我会将里面的大部分内容翻译成中文,再加上一些小y自己的解法和扩展内容,以博客的形式发在博客园.我想,这会是一件非常有趣的事情. 以下是翻译的前言部分,第1.4题以及其解析部分. 前言: 嗨,各位刷LeetCode的小伙伴们. 就像你们看到这本书

初刷LeetCode的感受

自从上个月进入实验室的云安全项目组后,因为要接触到实际的代码,在实验室博士的建议下我们项目组的硕士开始刷LeetCode练习编程能力,保持每周抽空刷几道算法题.虽然刷的不多,到现在一共只刷了不到30题,但在刷题的过程中还是有很多感触的. 实验室的博士建议我们按照题目的难易顺序循序渐进由易到难来刷,我也就照做了.因为前段时间在系统地学Python语言,所以我主要用的是Python语言来做,有的题目也采用了C/C++.Java甚至C#多种语言来尝试.在刷题的过程中,总结了自己的一些问题: 1. 对于

LeetCode: Linked List Cycle II [142]

[题目] 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? [题意] 给定一个单向链表,如果链表有环,则返回环开始的位置. [思路] 仍然是维护两个指针, p1, p2, p1每次走一步, p2每次走两步 假设进入环之前要走X步,环长为y步,p2第

leetcode题目思路以及部分解答(一)

为了进好公司这一个多月就得抽时间刷leetcode了..感觉这个OJ很不严谨...好多边界条件都没说清处..不过还好可以推测.唯一的好处就是不用自己编译调试,可以直接在网上显示出结果.当然,复杂一点的题目为了调试自己构建题目的结构也是很麻烦的...所以我发现提交里面错误好多.....再就是在笔记本上会时不时的变卡...每次提交都得等个3,4分钟才成功.要不就502错误... 我的题目按照通过率来.从通过率最高的题目开始讲解.每题不一定是最优解,都是我想得.仅供参考. 题目标题我都标好了.可以用c

准备刷leetcode!

前段时间才知道了这个刷题的地方,但是现在我连动规还没看完,决定把现在这本<计算机算法设计与分析>大概看完就去刷leetcode. 当然看书的时候也是要刷题的,就先刷着学校的sicily吧,毕竟用着挺习惯的. 恩,看完这本书看数据结构C语言那本. 一定要好好学英语,要不然连题目都看不懂...

leetcode题目思路以及部分解答(二)

又刷了30题了,这速度还不错.因为还有别的东西要复习,所以进度并不快.感觉还是能学到很多新东西的.早知道这个就不用去其他地方刷了.这个难度不高,还可以知道哪些情况没考虑.比其他OJ那种封闭式的好多了.还是进入正题吧. 1.Rotate Image 这个做过两三次了,但每次还是得重新开始推导..这次又推导了很久..不过好在做过,代码也写得比较简洁. 主要思路就是第一层循环按层次深入.第二层把旋转后对应替代的4个位置循环更新.swap就是用来更新用的.做完发现讨论里的最高票代码就是我这样子= =  

我也来刷LeetCode——0、Maximum Depth of Binary Tree(开篇)

作为一个非科班出身的程序员,还是很有必要刷刷题的.之前有个大牛说,菜鸟刷题可以从AC率高的刷起,这样可以快速培养信心.将LeetCode的题目按照AC率从高到低排序,第一道题目为 [Maximum Depth of Binary Tree]. 从题目就可以看出,是求二叉树的最大深度.深度的概念,是指从根节点到叶子节点的这条路径上的总节点数. 要求二叉树的最大深度,只需要求出左子树的深度和右子树的深度,取两者最大值再加 1 ,即为二叉树的最大深度. 若该二叉树为空,返回 0 . 然后就是将算法翻译