• 牛客《算法入门》链表(题解C++)


    1、反转链表

    描述
    给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。

    数据范围: 0\leq n\leq10000≤n≤1000
    要求:空间复杂度 O(1)O(1) ,时间复杂度 O(n)O(n) 。

    如当输入链表{1,2,3}时,
    经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。

    输入:
    {1,2,3}
    
    返回值:
    {3,2,1}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    /*
    struct ListNode {
    	int val;
    	struct ListNode *next;
    	ListNode(int x) :
    			val(x), next(NULL) {
    	}
    };*/
    class Solution {
    public:
        ListNode* ReverseList(ListNode* pHead) {
            ListNode* pre=NULL;
            ListNode* cur=pHead;
            while(cur!=NULL)
            {
                ListNode* temp=cur->next;
                cur->next=pre;
                pre=cur;
                cur=temp;
            }
            return pre;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    在这里插入图片描述

    2、合并两个排序的链表

    描述
    输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。
    数据范围: 0 \le n \le 10000≤n≤1000,-1000 \le 节点值 \le 1000−1000≤节点值≤1000
    要求:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)

    如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,6},所以对应的输出为{1,2,3,4,5,6},转换过程如下图所示:

    输入:
    {1,3,5},{2,4,6}
    
    返回值:
    {1,2,3,4,5,6}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    /*
    struct ListNode {
    	int val;
    	struct ListNode *next;
    	ListNode(int x) :
    			val(x), next(NULL) {
    	}
    };*/
    class Solution {
    public:
        ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
            ListNode* head=new ListNode(-1);
            ListNode* cur=head;
            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 head->next;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    初始化:定义cur指向新链表的头结点
    操作:
    如果l1指向的结点值小于等于l2指向的结点值,则将l1指向的结点值链接到cur的next指针,然后l1指向下一个结点值
    否则,让l2指向下一个结点值
    循环步骤1,2,直到l1或者l2为nullptr
    将l1或者l2剩下的部分链接到cur的后面

    3、删除链表节点

    描述
    给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。

    1.此题对比原题有改动
    2.题目保证链表中节点的值互不相同
    3.该题只会输出返回的链表和结果做对比,所以若使用 C 或 C++ 语言,你不需要 free 或 delete 被删除的节点

    数据范围:
    0<=链表节点值<=10000
    0<=链表长度<=10000

    输入:
    {2,5,1,9},5
    复制
    返回值:
    {2,1,9}
    复制
    说明:
    给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 2 -> 1 -> 9   
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    双指针

    /**
     * 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) {
            // write code here
            ListNode* vHead=new ListNode(-1);
            vHead->next=head;
            ListNode* pre=vHead;
            ListNode* cur=head;
            while(cur)
            {
                if(cur->val==val)
                {
                    pre->next=cur->next;
                    break;
                }
                pre=cur;
                cur=cur->next;
            }
            return vHead->next;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
  • 相关阅读:
    03梯度下降
    还在用递归?一文带你了解mysql数据库层面的树状查询
    RK3568-UART通信
    leetcode:135.分发糖果
    SprimgMVC增删改查·
    html制作小猪佩奇卡通图案代码,使用HTML和CSS3绘制基本卡通图案的示例分享
    Android Jetpack之LiveData源码分析
    威锋VL211是USB 3.1 Gen1集线器控制器,完全符合USB 3.1 Gen1规范
    Wnmp服务安装并结合内网穿透实现公网远程访问——“cpolar内网穿透”
    3.MySQL数据库的索引
  • 原文地址:https://blog.csdn.net/qq_57987156/article/details/126088922