OJ题地址:合并两个排序的链表_牛客题霸_牛客网https://www.nowcoder.com/share/jump/1650466461733473021450
一、题目描述
输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序
数据范围: 0≤≤10000≤n≤1000,−1000≤节点值≤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,2,4},{1,3,4}时,合并后的链表为{-1,1,2,3,4,4},所以对应的输出为{-1,1,2,3,4,4},转换过程如下图所示:
二、实例
示例1
输入:{1,3,5},{2,4,6}
返回值:{1,2,3,4,5,6}
示例2
输入:{},{}
返回值:{}
示例3
输入:{-1,2,4},{1,3,4}
返回值:{-1,1,2,3,4,4}
三、解题思路
1.判断输入的俩个链表是否为空,如果一个为空,直接输出另外一个链表
2.定义一个虚拟节点(dummy),为了链接俩个链表排序之后的新链表
3.用俩个指针,判断俩个链表的大小,更小的一个节点插入到虚拟节点的pre后,插入后让pre指针向后移动,更小的那个指针也向后移动
4.判断俩个链表的指针有没有走到尽头的,如果有一个指针为空,只需要把另一个链表的剩余节点插入到pre之后pre->next = phead1 ? phead1 : phead2
5.返回虚拟节点的下一个位置(即合并之后的链表的起始位置)return dummy->next
四、代码实现
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) : val(x), next(nullptr) {}
* };
*/
#include <list>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pHead1 ListNode类
* @param pHead2 ListNode类
* @return ListNode类
*/
ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
//一个已经为空了,直接返回另一个
if(pHead1 == nullptr)
return pHead2;
if(pHead2 == nullptr)
return pHead1;
ListNode* dummy = new ListNode(-1);
ListNode* pre = dummy;
while(pHead1 && pHead2)
{
if(pHead1->val <= pHead2->val)
{
pre->next = pHead1;
pHead1 = pHead1->next;
}
else
{
pre->next = pHead2;
pHead2 = pHead2->next;
}
pre = pre->next;
pre->next = pHead1 ? pHead1 : pHead2;
}
return dummy->next;
}
};