本专栏持续更新牛客题目解题思路及代码,欢迎感兴趣的朋友收藏⭐️专栏持续关注,共同进步
专栏直达地址:牛客刷题
描述
输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。
数据范围: 0 ≤ n ≤ 1000,−1000 ≤ 节点值 ≤ 1000
要求:空间复杂度 O(1),时间复杂度 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}
解题思路
创建一个新的链表,用两个指针分别遍历连个链表,取较小的节点放到新链表的尾部,遍历完成后将剩余结点放到新链表中即可
需要注意的点:
- 新链表增加一个头结点比较好
- 遍历完成后,将不为空的链表的剩余部分连接到新链表的尾部
代码
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) : val(x), next(nullptr) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pHead1 ListNode类
* @param pHead2 ListNode类
* @return ListNode类
*/
ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
if(!pHead1)
return pHead2;
else if(!pHead2)
return pHead1;
ListNode* cur1 = pHead1;
ListNode* cur2 = pHead2;
ListNode* newHead = new ListNode(0);
ListNode* cur = newHead;
// 遍历将两个链表的当前节点值小的放到新链表中
while (cur1 && cur2) {
if (cur1->val >= cur2->val) {
cur->next = cur2;
cur2 = cur2->next;
} else {
cur->next = cur1;
cur1 = cur1->next;
}
cur = cur->next;
}
// 合并剩下的部分
if(cur1)
cur->next=cur1;
else
cur->next=cur2;
return newHead->next;
}
};