考研算法 2022.2.27

126 阅读2分钟

考研算法

题目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

知识点

对于寻找公共节点的方法,可以使用数学思维

链表节点.png

图中,链表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