【算法入门&链表】【模板】链表|反转链表|合并排序链表|删除链表的节点(下)

简介: 【算法入门&链表】【模板】链表|反转链表|合并排序链表|删除链表的节点

2、AB10 ~ AB11题解

题目链接:合并两个排序链表

faa10bfc16b14850b96052cbbb997e94.png



2.1、解题思路

新创建一个链表,根据已知的两个递增链表的元素大小来升序的在新链表中存储数据

头插法建表,使用另外的链表指针作为辅助

当两个已知链表有一个已经遍历完时,直接让辅助指针指向非空的链表结点即可

2.2、代码实现及注释

本题源码:

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};*/
class Solution {
  public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
        ListNode* vhead = new ListNode(-1);
        ListNode* cur = vhead;
        while (pHead1 && pHead2) {
            if (pHead1->val <= pHead2->val) {
                cur->next = pHead1;
                pHead1 = pHead1->next;
            } else {
                cur->next = pHead2;
                pHead2 = pHead2->next;
            }
            cur = cur->next;
        }
        cur->next = pHead1 ? pHead1 : pHead2;
        return vhead->next;
    }
};

重要注释:


new ListNode(-1) 相当于创建了一个头结点,cur作为头插的赋值指针

while循环内部为头插法建立升序链表的过程

三目运算符目的是让新链表的尾指向剩余链表的头

最后返回的时候不需要头结点,因此结果为vhead->next

反转链表解析的博文地址:反转链表及进阶


反转链表的题目中我用了vector容器自带的reverse方法,非常适合入门新手


3、AB12 删除链表的节点

题目链接:删除链表节点

8681a509631e4b3fb936c29047578153.png



3.1、解题思路

观察链表的定义代码可知,该题链表是没有头结点的,那么就可以分情况讨论:


若链表第一个结点的值为目标值,直接返回结点的下一个指向即可

若链表首结点不是目标值,将其当作头结点即可,使用两个移动指针的方法:

步骤与本文上面 模板链表 步骤几乎一致,不做赘述

3.2、代码实现

/**
 * struct ListNode {
 *  int val;
 *  struct ListNode *next;
 *  ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param head ListNode类
     * @param val int整型
     * @return ListNode类
     */
    ListNode* deleteNode(ListNode* head, int val) {
        ListNode* ptr = head->next;
        if(head->val==val) return ptr;
        ListNode* pre = head;
        while (ptr) {
            if (ptr->val == val) {
                if (ptr->next) {
                    pre->next = ptr->next;
                    break;
                } else {
                    pre->next = NULL;
                }
            } else {
                pre = ptr;
                ptr = ptr->next;
            }
        }
        return head;
    }
};

链表题打牢基础的话,对后续数据结构的理解也有很大帮助,建议大家多多练习,题目旁的链接点进去即可挑战!


目录
相关文章
|
3月前
|
机器学习/深度学习 人工智能 算法
深度学习入门:理解神经网络与反向传播算法
【9月更文挑战第20天】本文将深入浅出地介绍深度学习中的基石—神经网络,以及背后的魔法—反向传播算法。我们将通过直观的例子和简单的数学公式,带你领略这一技术的魅力。无论你是编程新手,还是有一定基础的开发者,这篇文章都将为你打开深度学习的大门,让你对神经网络的工作原理有一个清晰的认识。
|
1月前
|
机器学习/深度学习 算法 Python
机器学习入门:理解并实现K-近邻算法
机器学习入门:理解并实现K-近邻算法
36 0
|
2月前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
25 0
LeetCode第二十四题(两两交换链表中的节点)
|
2月前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
45 0
Leetcode第十九题(删除链表的倒数第N个节点)
|
2月前
|
机器学习/深度学习 算法
机器学习入门(三):K近邻算法原理 | KNN算法原理
机器学习入门(三):K近邻算法原理 | KNN算法原理
|
2月前
|
传感器 算法 C语言
基于无线传感器网络的节点分簇算法matlab仿真
该程序对传感器网络进行分簇,考虑节点能量状态、拓扑位置及孤立节点等因素。相较于LEACH算法,本程序评估网络持续时间、节点死亡趋势及能量消耗。使用MATLAB 2022a版本运行,展示了节点能量管理优化及网络生命周期延长的效果。通过簇头管理和数据融合,实现了能量高效和网络可扩展性。
|
2月前
|
机器学习/深度学习 算法 大数据
机器学习入门:梯度下降算法(下)
机器学习入门:梯度下降算法(下)
|
2月前
|
机器学习/深度学习 算法 API
机器学习入门(五):KNN概述 | K 近邻算法 API,K值选择问题
机器学习入门(五):KNN概述 | K 近邻算法 API,K值选择问题
05_删除链表的倒数第N个节点
05_删除链表的倒数第N个节点
|
2月前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
56 0