精选力扣500题 第7题 LeetCode 21. 合并两个有序链表c++详细题解
Posted 林深时不见鹿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了精选力扣500题 第7题 LeetCode 21. 合并两个有序链表c++详细题解相关的知识,希望对你有一定的参考价值。
1、题目
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 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
均按 非递减顺序 排列
2、思路
(线性合并) O ( n ) O(n) O(n)
- 新建头部的保护结点
dummy
,设置cur
指针指向dummy
。 - 若当前
l1
指针指向的结点的值val
比l2
指针指向的结点的值val
小,则令cur
的next
指针指向l1
且l1
后移;否则指向l2
,且l2
后移。 - 然后
cur
指针按照上一部设置好的位置后移。 - 循环以上步骤直到
l1
或l2
为空。 - 将剩余的
l1
或l2
接到cur
指针后边。
3、代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
/*
1.归并排序的后半部分解法,二路归并
2.定义两个指针,分别指向两个链表
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
auto dummy=new ListNode(-1),cur = dummy ;
//对与链表中的涉及到头结点的操作,我们可以定义一个虚拟头结点
//这样不用再去特判头结点
while(l1&&l2)
{
if(l1->val <= l2->val)
{
cur->next = l1;
l1 = l1->next;
}
else
{
cur->next = l2;
l2 = l2->next;
}
cur = cur->next;
}
if(l1) cur->next = l1;
if(l2) cur->next = l2;
return dummy->next;
}
};
以上是关于精选力扣500题 第7题 LeetCode 21. 合并两个有序链表c++详细题解的主要内容,如果未能解决你的问题,请参考以下文章
精选力扣500题 第21题 LeetCode 42. 接雨水c++详细题解
精选力扣500题 第61题 LeetCode 78. 子集c++/java详细题解
精选力扣500题 第25题 LeetCode 54. 螺旋矩阵c++ / java 详细题解
精选力扣500题 第65题 LeetCode 322. 零钱兑换c++/java详细题解