合并2个单链接列表(无头节点)

时间:2017-10-25 11:22:52

标签: c merge singly-linked-list

我有2个单独链接列表没有头节点

列表1:[x1-> x2-> .....-> xn]

列表2:[y1-> y2-> ......-> ym]

合并后:

if(n

列表1:[x1-> y1-> x2-> y2-> .....-> xn-> yn-> y(n + 1) - > ... ..-> YM]

否则

列表1:[x1-> y1-> x2-> y2-> .....-> xm-> ym-> x(m + 1) - > ... ..-> XN]

这是我的合并功能:

void merge(NODE *list1, NODE *list2)
{
    NODE *ptr1 = list1;
    NODE *ptr2 = list2;

    while(1)
    {
        if(ptr2 == NULL)
            break;

        if(ptr1->next == NULL)
        {
            ptr1->next = ptr2;
            display(list1);

            while(list2 != NULL)
                list2 = list2->next;

            break;
        }

        list2 = list2->next;

        ptr2->next = ptr1->next;
        ptr1->next = ptr2;

        ptr2 = list2;
        ptr1 = (ptr1->next)->next;

        display(list1);
    }
}

但是在主函数中执行后,LIST 2应该是空的,但事实并非如此。

例如:

列表1:[1-> 2→ 3]

列表2:[5-> 6-> 7]

合并后:

列表1:[1-> 5→ 2→ 6-> 3→ 7]

列表2:[5-> 2→ 6-> 3→ 7](这应该是空的)

请解释一下!

修改:

示例输出:

---------- [列表1] ----------

输入一个元素(-123退出):1

[列表:1]

输入一个元素(-123退出):2

[列表:1 2]

输入一个元素(-123退出): - 123

---------- [清单2] ----------

输入一个元素(-123退出):5

[列表:5]

输入一个元素(-123退出):6

[列表:5 6]

输入一个元素(-123退出):7

[列表:5 6 7]

输入一个元素(-123退出):8

[列表:5 6 7 8]

输入一个元素(-123退出): - 123

[列表:1 5 2]

[列表:1 5 2 6 7 8]

---------- [合并清单] ----------

[列表:1 5 2 6 7 8]

[列表:5 2 6 7 8]

2 个答案:

答案 0 :(得分:1)

List2没有理由为空:

列表2不是字面上的列表,只是指向第二个列表的第一个元素的指针,它在合并后成为完整列表的第二个元素。

在内存中,只有一个列表[1->5->2-> 6-> 3-> 7],指针list1指向其第一个元素,list2指向第二个元素。

因此,当您打印list1时,它将从1开始打印列表,而当您打印list2时,它将从5开始打印列表

答案 1 :(得分:0)

指针是指针。他们只是指出事情。有一个指向链表中间的指针是完全有效的。这样,一个列表可以是另一个列表的子集。正如评论中所指出的,这不是合并函数的奇怪行为。

如果你想这样做: 为了“使列表2为空”,您可以在通话后取消引用它。像这样:

merge(list1, list2);
list2 = NULL;

如果你想在函数中执行它,你可以使用指针指针:

void merge(NODE **list1, NODE **list2)
{
    NODE *ptr1 = *list1;
    NODE *ptr2 = *list2;    
 // Do stuff
    if(blabla) 
        **list1 = NULL;
    else
        **list2 = NULL;
}

然后像这样调用merge:

merge(&list1, &list1)