满难度系数
* * * * *
,此题难度系数* * *
。
满考频热度* * * * *
,此题热度* * * * *
。
1. 题目描述
2. 题目链接
- 牛客题目链接合并有序链表
3. 题目剖析
- 首先前提是两个
有序链表l1,l2
。将他们合并为一个有序链表
。 - 利用
归并排序
的思想,建立一个哨兵结点,每次取两个链表中较小的进行合并。 - 注意问题是两个
链表长度可能会不一样长
,要考虑处理。 - 这个题除了哨兵结点之外不要开辟另外的空间,将链表l1,l2从新进行有序链接。
哨兵结点的好处是如果两个链表都为空则不需要判断,最后返回NewHead->next也为空
。
3.1剖析图示
3.2 图示详解
- 先定义一个哨兵结点,指向l1,l2里面最小的。
- 然后再找次小的进行链接。
- 如此迭代,直到两个链表都遍历完毕。
4. 解题代码
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
class Solution {
public:
/**
*
* @param l1 ListNode类
* @param l2 ListNode类
* @return ListNode类
*/
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode *NewHead = new ListNode(0);//注释1
ListNode *Node = NewHead;
//注释2
if(l1 == nullptr)
{
return l2;
}
if(l2 == nullptr)
{
return l1;
}
//注释3
while(l1 && l2)
{
if(l1->val < l2 ->val)
{
Node -> next = l1;
Node = Node ->next;
l1 = l1 -> next;
}
else
{
Node -> next = l2;
Node = Node -> next;
l2 = l2 ->next;
}
}
//注释4
while(l1)
{
Node -> next = l1;
Node = Node -> next;
l1 = l1 -> next;
}
while(l2)
{
Node -> next = l2;
Node = Node -> next;
l2 = l2 ->next;
}
//注释5
return NewHead->next;
}
};
5. 代码注释详解
- 注释1:先建立一个哨兵结点,让最小的直接链接在后面。
- 注释2:如果两个有序链表中有一个为nullptr则直接返回另外一个。
- 注释3:两个链表中有一个为空时则结束循环,循环内部每次找次小的结点进行链接。利用的是归并排序的思想。
- 注释4:如果两个链表有一个为空,另一个还没有为nullptr则直接将剩下的链接在后面。
- 注释5:因为设立了哨兵结点,所以返回的是哨兵结点的下一个。
合并有序链表算法复杂度为:
- 时间复杂度:O(n)
- 空间复杂度:O(1)
1.如有错误或者没能理解的地方,请及时评论或者私信,及时修改更新
。
2.会持续更新相关链表高频题目,分类专栏—数据结构
。