c语言数据结构链表空指针问题

这是一个在LeetCode上面的问题,就是把两个已经排序的链表合成一个也是排序的链表,如{1,2,3},{2,3,5}变为{1,2,2,3,3,5};

在指针传入mergeTwoLists(struct ListNode* l1, struct ListNode* l2) 函数之前,就对其进行验证,看其是否为空指针在指针传入mergeTwoLists(struct ListNode* l1, struct ListNode* l2) 函数之前,就对其进行验证,看其是否为空指针
结果说明不是空指针
结果说明不是
但是最后结果却说l2是一个空指针,想不通但是最后结果让人很无奈

结果
图片说明
附上源代码

 #include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct ListNode {
    int val;
    struct ListNode *next;
};
void Print(struct ListNode* l);
struct ListNode* CreateList(int a[]);
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2);
int main() {
    int a[] = { 1,2,3,4 };
    int b[] = { 1,2,3,4,5 };
    struct ListNode* ptr1 = CreateList(a);
    struct ListNode* ptr2 = CreateList(b);
    if (ptr2 == NULL)
        printf("a null");
    printf("not a null\n");
    printf("%d", ptr2->val);
    printf("%d", ptr2->next->val);
    printf("%d", ptr2->next->next->val);
    printf("%d", ptr2->next->next->next->val);
    struct ListNode* ptr3 = mergeTwoLists(ptr1, ptr2);
    //printf("%d", ptr3->val);
    //printf("%d", ptr3->next->val);
    //printf("%d", ptr3->next->next->val);
    //printf("%d", ptr3->next->next->next->val);
    system("pause");
}

struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2)
//将l1 和 l2 合成 l3, 并返回指向l3的指针
{
    if (l1 == NULL&&l2 == NULL) return NULL;

    struct ListNode* res = (struct ListNode*)malloc(sizeof(struct ListNode));
    res->val = 0;
    res->next = NULL;
    struct ListNode* head = res;

    while (l1 != NULL || l2 != NULL)
    {
        if (l1 == NULL) 
        {
            res->next = l2;
            res = l2;
            l2 = l2->next;
        }
        else if(l2==NULL)
        {
            res->next = l1;
            res = l1;
            l1 = l1->next;
        }

        if (l1->val >= l2->val)
        {
            res->next = l2;
            res = l2;
            l2 = l2->next;
        }
        else
        {
            res->next = l1;
            res = l1;
            l1 = l1->next;

        }
    }
    return head->next;
}
struct ListNode* CreateList(int a[])//用数组a创造一个链表
{
    struct ListNode* res = (struct ListNode*)malloc(sizeof(struct ListNode));
    res->val = 0;
    res->next = NULL;
    struct ListNode* head = res;
    struct ListNode*new;
    int length = sizeof(a);
    //printf("%d", length);
    for (int i = 0; i < length; i++)
    {
        res->val = a[i];
        //printf_s("%d-------", res->val);
        new = (struct ListNode*)malloc(sizeof(struct ListNode));
        new->val = 0;
        new->next = NULL;
        res->next = new;
        res = res->next;

    }
    //printf("%d", head->val);
    //printf("%d", head->next->val);
    //printf("%d", head->next->next->val);
    //printf("%d", head->next->next->next->val);
    return head;
}
1

2个回答

对 if else语句块的执行理解有误。if语句块执行完毕后,整个if else就执行完了,不会执行完if 语句块再去执行else部分, 试想对下面语句,如果此时:
l1 == NULL, l2 != NULL, l2->next == NULL,
if (l1 == NULL)
{
res->next = l2;
res = l2;
l2 = l2->next;
}// 此时if else语句整体结束, 此时l1==NULL, l2==NULL
else if(l2==NULL)
{
res->next = l1;
res = l1;
l1 = l1->next;
}

          if (l1->val >= l2->val) //此处试图取NULL指针的值,自然会出错,实际上不同的编译器既可能报告l1为空,也可能报告l2为空,因为该处到底
                                                                            //先求那部分的值规范并没有定义,取决于编译器, 报告l1是nullptr也是可能的
            {
0
qq_36888679
QQ u don't learn le 问题完美解决!!!谢谢你啊!爱你!~(原谅一个小白~)
一年多之前 回复

在存储的时候,多注意指针的位置,区分指针和内存地址的关系

1
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!