描述

输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。

数据范围: 0≤10000≤n≤1000,−1000≤节点值≤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},转换过程如下图所示:

09DD8C2662B96CE14928333F055C5580

或输入{-1,2,4},{1,3,4}时,合并后的链表为{-1,1,2,3,4,4},所以对应的输出为{-1,1,2,3,4,4},转换过程如下图所示:

8266E4BFEDA1BD42D8F9794EB4EA0A13

示例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

可以使用虚拟头结点,可以再新建一个链表,然后把两个链表的结点从小到大依次插入到新链表中即可。使用双指针分别指向两个链表,然后每次将较小的结点放在虚拟头结点后面,然后指针(刚刚较小的)放后移动,另一个指针不动

/**
* 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) {
// write code here
if (pHead1 == nullptr)
return pHead2;
if (pHead2 == nullptr)
return pHead1;
ListNode* p = pHead2, *q = pHead1;
ListNode* newHead;
newHead = p->val <= q->val ? p : q;
ListNode *res = newHead;
while (p != nullptr && q != nullptr) {
if (p->val <= q->val) {
ListNode* tmp = p->next;
ListNode* node = p;
newHead->next = node;
newHead = node;
p = tmp;
} else {
ListNode* tmp = q->next;
ListNode* node = q;
newHead->next = node;
newHead = node;
q = tmp;
}
}
while (p != nullptr) {
newHead->next = p;
newHead = p;
p = p->next;
}
while (q != nullptr) {
newHead->next = q;
newHead = q;
q = q->next;
}
return res;
}
};

本来打算将一个链表插入到另一个链表之中的,但是太复杂了,一直没有AC