算法打卡day17-合并两个排序的链表

104 阅读1分钟

描述

输入两个递增的链表,单个链表的长度为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;
}