C语言将两个升序链表合并为一个新的升序链表并返回,我的链表合并代码VS上可以运行,leetcode上为什么报错?

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

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>

typedef struct Node{
     int val;
     struct Node *next;
}Node,* ListNode;
 
void printLinkList(ListNode L);
ListNode createTail(ListNode L);

//初始化一个链表
ListNode LinkListInit() {
    Node* L;
    L = (Node*)malloc(sizeof(Node));   //申请结点空间 
    if (L == NULL) { //判断是否有足够的内存空间 
        printf("申请内存空间失败\n");
    }
    L->next = NULL;//将next设置为NULL,初始长度为0的单链表 
    return L;
}
//输入一个升序链表
ListNode createTail(ListNode L) {
    int x;
    Node* s, * r = L;
    printf("输入一个升序链表:\n");
    scanf("%d", &x);
    while (x != 9999) {
        s = (Node*)malloc(sizeof(Node));
        s->val = x;
        r->next = s;
        r = s;
        scanf("%d", &x);
    }
    r->next = NULL;
    return L;
}

//链表拼接
ListNode mergeTwoLists(ListNode L1, ListNode L2) {
    ListNode r, s,P;
    Node* m,*p;
    P = LinkListInit();
    p = P;
    r = L1->next;
    s = L2->next;
    if (r == NULL) {
        return L2;
    }
    else if(s == NULL){
        return L1;
    }
    else if (s == NULL && r == NULL) {
        return 0;
    }
    while (r != NULL && s != NULL) {
        if (r->val <= s->val) {
            p->next = r;
            p = r;
            r = r->next;
            //p->next = NULL;
        }
        else {
            p->next = s;
            p = s;
            s = s->next;
        }
    }
    if (r != NULL) {
        p->next = r;
        p = r;
        r = r->next;
    }
    if (s != NULL) {
        p->next = s;
        p = s;
        s = s->next;
    }
    p->next = NULL;
    return P;
}


//输出链表
void printLinkList(ListNode L)
{
    ListNode p;
    p = L->next;
    if (p == NULL) {
        printf(" ");
    }
    while (p)
    {
        printf("%d ", p->val);
        p = p->next;
    }
    printf("\n");
}


int main(void) {
    ListNode L1, L2,R,L;
    L1 = LinkListInit();
    L2 = LinkListInit();
    L = LinkListInit();
    R = LinkListInit();
    createTail(L1);
    createTail(L2);
    R = mergeTwoLists(L1, L2);
    printLinkList(R);
    return 0;
}

我的链表合并以及排序的函数(mergeTwoLists)代码是哪里有问题吗,为什么我在VS上运行没报错,leetcode上运行就报错了

效果图片
image.png
leetcode报错图片
image.png

阅读 1.7k
1 个回答

leetcode 上每一个 Node 都是有 val 的。

你的链表的头节点是没有一个有效的 val 的,从第二个节点才开始有 val 。所以合并的时候也跳过了头节点。所以,你在合并 leetcode 的链表的时候,也跳过了第一个节点(两个 1 ),然后增加了一个没有有效 val 的头节点(最后 val 被打印出来是 -1094xxxx),就得到了你看到的结果。

推荐问题
logo
Microsoft
子站问答
访问
宣传栏