LeetCode 21.合并两个有序链表(c++)

115 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天,点击查看活动详情

前言

从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!

一、题目描述

21.合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例 1:

输入: l1 = [1,2,4], l2 = [1,3,4]
输出: [1,1,2,3,4,4]

示例 2:

输入: l1 = [], l2 = []
输出: []

示例 3:

输入: l1 = [], l2 = [0]
输出: [0]

提示:

  • 两个链表的节点数目范围是 [0, 50]
  • -100 <= Node.val <= 100
  • l1 和 l2 均按 非递减顺序 排列

二、思路分析

这是一道简单难度的题目,相比于昨天的题目对链表的考察更深了一些。首先要掌握以下几点:

1、头指针是链表中第一个结点的存储位置,一般就是链表名。

2、"ListNode* p = new ListNode()"是什么意思?我查阅了一些资料,ListNode* p是定义了一个结构体指针,所谓结构体指针就是指向结构体数据的指针,也就是说p能够指向struct ListNode类型的数据。而new ListNode()则是初始化了一个空节点,从LeetCode的默认链表定义中也可以看到,该节点的val=0,next为空。而用new则是在系统中为该节点分配了一个地址。

3、dummy为一个虚拟节点,所以最后只需要返回dummy->next,就能够抛弃该结点,直接返回真正的处理后的链表节点。

三、AC代码

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
        ListNode* p = new ListNode();
        ListNode* dummy =new ListNode();
        p=dummy;
        while(list1 !=nullptr && list2!=nullptr){
            if(list1->val > list2->val){
                p->next = list2;
                list2=list2->next;
            }
            else{
                p->next = list1;
                list1 = list1->next;
            }
            p=p->next;
        }
        if(list1!=nullptr) p->next= list1;
        if(list2!=nullptr) p->next= list2;
        return dummy->next;
    }
};

提交排名

image.png

四、总结

今天又学习到了新的链表的相关知识。