持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天,点击查看活动详情
前言
从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!
一、题目描述
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 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 <= 100l1和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;
}
};
提交排名
四、总结
今天又学习到了新的链表的相关知识。