【问题标题】:Merge two sorted linked lists: space complexity合并两个有序链表:空间复杂度
【发布时间】:2021-10-11 15:34:20
【问题描述】:

我在看following Geeks for Geeks problem:

给定两个有序链表,分别由 N 和 M 个节点组成。任务是合并列表(就地)并返回合并列表的头部。

示例 1

Input:
N = 4, M = 3  
valueN[] = {5,10,15,40}  
valueM[] = {2,3,20}  
Output: 2 3 5 10 15 20 40   
Explanation: After merging the two linked
lists, we have merged list as 2, 3, 5,
10, 15, 20, 40.   

下面的答案是GFG的答案。我不明白它的空间复杂度是 O(1)。我们正在创建一个新节点,所以它必须是 O(m+n)。

Node* sortedMerge(Node* head1, Node* head2)  
{  
    struct Node *dummy = new Node(0);  
    struct Node *tail = dummy;  
    while (1) {  
        if (head1 == NULL) {  
            tail->next = head2;  
            break;  
        }  
        else if (head2 == NULL) {  
            tail->next = head1;  
            break;  
        }
        if (head1->data <= head2->data){
            tail->next = head1;
            head1 = head1->next;
        }
        else{
            tail->next = head2;
            head2 = head2->next;
        }
        tail = tail->next;
    }
    return dummy->next;     
}  

有人能解释一下这里的空间复杂度是 O(1) 吗?

【问题讨论】:

    标签: linked-list


    【解决方案1】:

    我不明白它的空间复杂度是 O(1)。由于我们正在创建一个新节点,所以它必须是 O(m+n)。

    创建一个节点时为什么要O(m+n)?该节点的大小是一个常数,因此一个节点表示 O(1) 空间复杂度。创建一个节点与任一输入列表的大小无关。请注意,节点是在循环之外创建的。

    实际上这样做是为了保持代码简单,但即使没有 dummy 节点也可以进行合并。

    【讨论】:

    • 哦,我明白了。非常感谢。
    • 在 C 或 C++ 中,可以使用指向节点的指针而不是虚拟节点,而不需要条件代码(if 语句)来处理第一个节点,但是对于像 Java 这样的语言,虚拟节点节点是常用的。该问题未指定语言。
    猜你喜欢
    • 2012-05-07
    • 2023-02-07
    • 2016-11-19
    • 2016-02-03
    • 1970-01-01
    • 2013-05-05
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多