描述
输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。
数据范围: 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* Merge(struct ListNode* pHead1, struct ListNode* pHead2 ) {
struct ListNode* p = pHead1;
struct ListNode* q = pHead2;
struct ListNode* r = (struct ListNode*)malloc(sizeof(struct
ListNode)); //创建一个头节点
struct ListNode* head = r; //创建一个指向r的指针 方便后面return
while (p != NULL && q != NULL) {
if (p->val <= q->val) { //跟着指针走 始终让r能在最前面
r->next = p;
p = p->next;
r = r->next;
} else {
r->next = q;
q = q->next;
r = r->next;
}
}
r->next = NULL;
if (p != NULL)r->next =
p; //比较完之后 表中还有剩下的数可以直接接上
if (q != NULL)r->next = q;
return head->next;
}