考研算法
题目1
题目要求
寻找链表的公共节点
C++代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *findFirstCommonNode(ListNode *headA, ListNode *headB) {
ListNode *p=headA;
ListNode *q=headB;
while (q!=p)
{
if (q==NULL)
{
q=headA;
}
else q=q->next;
if (p==NULL)
{
p=headB;
}
else p=p->next;
}
return q;
}
};
python代码
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def findFirstCommonNode(self, headA, headB):
"""
:type headA, headB: ListNode
:rtype: ListNode
"""
q=headB
p=headA
while (q!=p):
if q==None:
q=headA
else: q=q.next
if p==None:
p=headB
else: p=p.next
return p
知识点
对于寻找公共节点的方法,可以使用数学思维
图中,链表A为a+c,链表B为b+c
设a,b,c链表片段的长度分别为la,lb,lc
将一个指针从A链表的头开始走,走到A的末尾,再从B的开头走
另一指针的顺序则为相反
当两个指针走完后,他们走的距离分别为[la+lc+lb],[lb+lc+la]
若他们存在公共节点,就一定会相遇(距离相同)
若不存在公共节点,while循环就无法退出,知道全部走到空节点
此时输出任一指针即可。\
题目2
题目要求
保留第一次出现的结点而删除其余绝对值相等的结点
C++代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* filterList(ListNode* head) {
if (head==NULL) return head;
unordered_map<int,int> h;
auto q=head;
h[abs(q->val)]++;
while (q)
{
if (q->next)
{
if (h[abs(q->next->val)]>0)
{
q->next=q->next->next;
continue;
}
}
q=q->next;
if (q) h[abs(q->val)]++;
}
return head;
}
};
知识点
unordered_map<int,int> h;无序关联式容器(我愿意称之为哈希表)
C++哈希表的使用 - Crazy_Coding - 博客园 (cnblogs.com)
C++ STL hash表用法 - 牧野星辰 - 博客园 (cnblogs.com)
auto自动推理变量的类型
python代码
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def filterList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
if head==None:return head
lis={}
q=head
lis[str(abs(q.val))]=1
while (q):
if (q.next):
if (str(abs(q.next.val)) in lis):
q.next=q.next.next
continue
q=q.next
if (q):lis[str(abs(q.val))]=1
return head
知识点
此处用字典方式来实现哈希表
str(abs(q.next.val)) in lis判断是否存在键值
Python dict字典基本操作(包括添加、修改、删除键值对)_yinlu521wang的博客-CSDN博客_dict删除key