力扣——21.合并两个有序链表(c语言)

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

1、递归实现:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
    if(NULL == l1){
        return l2;
    }
    if(NULL == l2){
        return l1;
    }
    if(l1->val < l2->val){
        l1->next = mergeTwoLists(l1->next, l2);
        return l1;
    } else{
        l2->next = mergeTwoLists(l1, l2->next);
        return l2;
    }
}

复杂度分析:

时间复杂度:O(n+m),其中n和m分别为两个链表的长度。

空间复杂度:O(n+m),其中n和m分别为两个链表的长度。

递归调用 mergeTwoLists 会消耗栈空间。

执行结果:

执行用时:4 ms, 在所有 C 提交中击败了91.93%的用户

内存消耗:5.9 MB, 在所有 C 提交中击败了71.35%的用户

2、迭代实现:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
    struct ListNode* result = (struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode* prev = result;

    while(l1!=NULL && l2!=NULL)
    {
        if(l1->val < l2->val){
            prev->next = l1;
            l1 = l1->next;
        } else{
            prev->next = l2;
            l2 = l2->next;
        }
        prev = prev->next;
    }
    prev->next = (l1==NULL)?l2:l1;
    return result->next;
    
}

复杂度分析:

时间复杂度:O(n+m),其中n和m分别为两个链表的长度。

空间复杂度:O(1),需要常数的时间存放若干变量。

执行结果:

执行用时:4 ms, 在所有 C 提交中击败了91.93%的用户

内存消耗:6 MB, 在所有 C 提交中击败了50.79%的用户

posted @ 2023-04-22 13:42  调蓝师  阅读(240)  评论(0)    收藏  举报