LeetCode刷题day13

简介: LeetCode刷题day13

242. 有效的字母异位词


给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

示例 1:

输入: s = "anagram", t = "nagaram"
输出: true


示例 2:

输入: s = "rat", t = "car"
输出: false


参考代码

#include<bits/stdc++.h>
using namespace std;
int arr[27];
bool isAnagram(string s, string t) {
  int temp,temp2;
  if(s.size()!=t.size()) {
    return false;
  }
  for(int i = 0; i<s.size(); i++) {
    temp = s[i]-'a';
    temp2 = t[i]-'a';
    arr[temp]++;
    arr[temp2]--;
  }
  for(int i = 0; i < 27; i++) {
    if(arr[i]!=0) {
      return false;
    }
  }
  return true;
}
bool isAnagram2(string s, string t) {
  if(s.size()!=t.size()) {
    return false;
  }
  sort(s.begin(),s.end());
  sort(t.begin(),t.end());
  if(s==t) {
    return true;
  }
  return false;
}
int main() {
  return 0;
}

141. 环形链表

给定一个链表,判断链表中是否有环。


如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。


如果链表中存在环,则返回 true 。 否则,返回 false 。


进阶:


你能用 O(1)(即,常量)内存解决此问题吗?


示例 1


3a591c5c75fd4c6aa3566171e425d7a7.png


输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。


示例 2:


ef2fad569ec74e52b7b2fcb9f2cec1e8.png



输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:

03106f086c5949b09d7cb25b8597ca50.png

输入:head = [1], pos = -1
输出:false
解释:链表中没有环。

题目分析:

请参考 常见的链表问题

参考代码:

#include<bits/stdc++.h>
using namespace std;
struct ListNode {
  int val;
  ListNode *next;
  ListNode(int x) : val(x), next(NULL) {}
  };
bool hasCycle(ListNode *head) {
  ListNode *slow = head;
  ListNode *fast = head;
  while(fast!=NULL){
    fast = fast->next;
    if(fast!=NULL){
      fast = fast->next;
    }else{
      continue;
    }
    slow = slow->next;
    if(fast==slow){
      return true;
    }
  } 
  return false;
}
int main() {
  return 0;
}

21. 合并两个有序链表


将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例 1:

dd7ffbb634274cb79f3b74489ed070a5.png


输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]

示例 2:

输入:l1 = [], l2 = []
输出:[]

示例 3:

输入:l1 = [], l2 = [0]
输出:[0]


方法一

a27fc2b9fe8e42b08a2e3af9968c3f31.jpg


链表的基本使用.

参考代码:

#include<bits/stdc++.h>
using namespace std;
struct ListNode {
  int val;
  ListNode *next;
  ListNode() : val(0), next(nullptr) {}
  ListNode(int x) : val(x), next(nullptr) {}
  ListNode(int x, ListNode *next) : val(x), next(next) {}
};
// 链表的基本使用.. 
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
//  ListNode *head1 = new ListNode(-1,l1);
//  ListNode *head2 = new ListNode(-1,l2);
  ListNode *head3 = new ListNode(-1);
  ListNode *p = l1;
  ListNode *q = l2;
  ListNode *r = head3;
  while(p!=nullptr&&q!=nullptr) {
    if(p->val<=q->val) {
      r->next = p;//r的next指向小的节点.
      r = r->next;//r更新
      p=p->next;
    }else{
      r->next = q;
      r = r->next;
      q = q->next;
    }
  }
  if(p==nullptr) {
    r->next = q;
  }
  if(q==nullptr){
    r->next = p;
  }
//  delete head1,head2; 
  return head3->next;
}
int main() {
  return 0;
}

方法2

递归

参考代码

#include<bits/stdc++.h>
using namespace std;
struct ListNode {
  int val;
  ListNode *next;
  ListNode() : val(0), next(nullptr) {}
  ListNode(int x) : val(x), next(nullptr) {}
  ListNode(int x, ListNode *next) : val(x), next(next) {}
};
// 链表的基本使用..
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
  if(l1==nullptr) {
    return l2;
  }
  if(l2==nullptr) {
    return l1;
  }
  if(l1->val <= l2->val) {
    l1->next = mergeTwoLists(l1->next,l2);
    return l1;//下面的语句不会执行了
  } else {
    l2->next = mergeTwoLists(l1,l2->next);//l1->val > l2->val
    return l2;
  }
}
int main() {
  return 0;
}
//merge(1,1): 1->4->5->null, 1->2->3->6->null
//  merge(2,1) 4->5->null, 1->2->3->6->null
//    merge(2,2) 4->5->null,2->3->6->null 
//      merge(2,3) 4->5->null,3->6->null
//        merge(2,4) 4->5->null,6->null
//          merge(3,4) 5->null,6->null
//            merge(4,4) null,6->null
//              return l2:  6->null   
//          return l1.next  5->6->null
//        return l1.next 4->5->6->next
//      return l2.next 3->4->5->6
//    return l2.next-> 2->3->4->5->6
//  return 12->next  1->2->3->4->5->6
//return l1->next  = 1->1->2->3->4->5->6  return l1


203. 移除链表元素

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

示例 1:015d1a0b3c704a3791aeab73a6f7dae0.png

输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]

示例 2:

输入:head = [], val = 1
输出:[]

示例 3:

输入:head = [7,7,7,7], val = 7
输出:[]

题目分析

同上

参考代码:

#include<bits/stdc++.h>
using namespace std;
struct ListNode {
  int val;
  ListNode *next;
  ListNode() : val(0), next(nullptr) {}
  ListNode(int x) : val(x), next(nullptr) {}
  ListNode(int x, ListNode *next) : val(x), next(next) {}
};
ListNode* removeElements(ListNode* l, int val) {
  ListNode *head = new ListNode(-1,l);
  ListNode *p = head;
  while(p->next!=nullptr) {
    if(p->next->val=val) {
      p->next =  p->next->next;
    } else {
      p = p->next;
    }
  }
  return head->next;
}
ListNode* removeElements2(ListNode* l, int val) {
  ListNode *head = new ListNode(-1,l);
  ListNode *p = head;
  ListNode *q = head;
  while(p->next!=nullptr) {
    p = p->next;
    if(p->val==val) {
      q->next = p->next;
      // q = q->next;// 如果相等,则q不用变化了..
    } else {
      q = q->next;
    }
  }
  return head->next;
}
int main() {
  return 0;
}
相关文章
|
1月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
41 6
|
1月前
|
Python
【Leetcode刷题Python】剑指 Offer 26. 树的子结构
这篇文章提供了解决LeetCode上"剑指Offer 26. 树的子结构"问题的Python代码实现和解析,判断一棵树B是否是另一棵树A的子结构。
35 4
|
1月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
73 2
|
1月前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
36 7
|
1月前
|
Python
【Leetcode刷题Python】剑指 Offer 30. 包含min函数的栈
本文提供了实现一个包含min函数的栈的Python代码,确保min、push和pop操作的时间复杂度为O(1)。
17 4
|
1月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
40 5
|
1月前
|
算法 Python
【Leetcode刷题Python】 LeetCode 2038. 如果相邻两个颜色均相同则删除当前颜色
本文介绍了LeetCode 2038题的解法,题目要求在一个由'A'和'B'组成的字符串中,按照特定规则轮流删除颜色片段,判断Alice是否能够获胜,并提供了Python的实现代码。
36 3
|
1月前
|
算法 Python
【Leetcode刷题Python】剑指 Offer 33. 二叉搜索树的后序遍历序列
本文提供了一种Python算法,用以判断给定整数数组是否为某二叉搜索树的后序遍历结果,通过识别根节点并递归验证左右子树的值是否满足二叉搜索树的性质。
15 3
|
1月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - II. 从上到下打印二叉树 II
本文提供了一种Python实现方法,用于层次遍历二叉树并按层打印结果,每层节点按从左到右的顺序排列,每层打印到一行。
28 3
|
1月前
|
Python
【Leetcode刷题Python】剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
Leetcode题目"剑指 Offer 21. 调整数组顺序使奇数位于偶数前面"的两种Python解决方案,一种是使用双端队列调整数组顺序,另一种是使用双指针法将奇数移到数组前半部分,偶数移到后半部分。
21 4