这是一个在LeetCode上面的问题,就是把两个已经排序的链表合成一个也是排序的链表,如{1,2,3},{2,3,5}变为{1,2,2,3,3,5};
在指针传入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;
}