leetcode做题记录
链表
21.合并两个有序链表
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
这道题自己一开始的想法是弄一个新的链表,遍历完两个输入的链表,节点小的添加进链表。看了题解发现使用递归方法很实用,自己也没有递归的思想。简单地说就是把找出小的节点指向剩余的两个链表,在这两个链表中继续找小的节点,重复步骤,返回的值应该是哪个节点更新了,就返回哪个节点。还是的流程就是加入链表为空直接返回另一个链表。
class Solution {
public:
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
if(list1==NULL)
{
return list2;
}
if(list2==NULL)
{
return list1;
}
if(list1->val<=list2->val)
{
list1->next=mergeTwoLists(list1->next,list2);
return list1;
}
list2->next=mergeTwoLists(list1,list2->next);
return list2;
}
};
141.环形链表
给你一个链表的头节点 head ,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。
如果链表中存在环 ,则返回 true 。 否则,返回 false 。
哈希表
使用哈希表记录出现过的ListNode。
然后从头指针开始遍历,要是这个指针在哈希表里面找到了就返回true。
class Solution {
public:
bool hasCycle(ListNode *head) {
unordered_set<ListNode*>obj;
while(head!=nullptr)
{
if(obj.count(head)==0)
{
obj.insert(head);
head=head->next;
}
else
{
return true;
}
return false;
}
};
快慢指针
一个块一个慢,慢指针一个步长,快指针两个步长,慢指针每次只移动一下,只要有环,快指针就会追上。想象一下快指针从后面快追上慢指针时,快指针距离慢指针距离是1或者2(3的话相当于下一次相距2),每次减少距离1,就会遇到。
class Solution {
public:
bool hasCycle(ListNode* head) {
if (head == nullptr || head->next == nullptr) {
return false;
}
ListNode* slow = head;
ListNode* fast = head->next;
while (slow != fast) {
if (fast == nullptr || fast->next == nullptr) {
return false;
}
slow = slow->next;
fast = fast->next->next;
}
return true;
}
};
作者:LeetCode-Solution
链接:https://leetcode.cn/problems/linked-list-cycle/solution/huan-xing-lian-biao-by-leetcode-solution/
203.移除链表元素
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]
还是没有想到使用递归的方法,自己使用的是找到值相等的就把指针指向下个指针指向的下个指针。使用递归的话注意每次调用函数都会传入head->next,相当于一直走走到了尾巴,然后从最后面往回判断,值相等返回的是下个,值不相等,返回的是本身。
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode *p=head;
if(head==nullptr)
{
return nullptr;
}
head->next=removeElements(head->next,val);
if(head->val==val)
{
return head->next;
}else
{
return head;
}
return p;
}
};