当前位置: 首页 > 知识库问答 >
问题:

c - C语言将两个升序链表合并为一个新的升序链表并返回,我的链表合并代码是哪里出错了?

郤飞英
2023-05-15

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

#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 (L1 != NULL && L2 != NULL) {
        if (L1->val <= L2->val) {
            m = (Node*)malloc(sizeof(Node));
            m->val = L1->val;
            p->next = m;
            p = m;
            L1 = L1->next;
            p->next = NULL;
        }
        else {
            m = (Node*)malloc(sizeof(Node));
            m->val = L2->val;
            p->next = m;
            p = m;
            L2 = L2->next;
            p->next = NULL;
        }
    }
    if (L1 != NULL) {
        m = (Node*)malloc(sizeof(Node));
        m->val = L1->val;
        p->next = m;
        p = m;
        L1 = L1->next;
        p->next = NULL;
    }
    if (L1 != NULL) {
        m = (Node*)malloc(sizeof(Node));
        m->val = L2->val;
        p->next = m;
        p = m;
        L2 = L2->next;
        p->next = NULL;
    }
    p->next = NULL;
    return P;
}


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


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)代码是哪里有问题吗,为什么输出的结果这么怪异。。。

效果图片
image.png

共有1个答案

储修谨
2023-05-15
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
    if (l1 == NULL) {
        return l2;
    } else if (l2 == NULL) {
        return l1;
    }

    struct ListNode *dummy = (struct ListNode*) malloc(sizeof(struct ListNode));
    struct ListNode *cur = dummy;

    while (l1 != NULL && l2 != NULL) {
        if (l1->val <= l2->val) {
            cur->next = l1;
            l1 = l1->next;
        } else {
            cur->next = l2;
            l2 = l2->next;
        }
        cur = cur->next;
    }

    if (l1 != NULL) {
        cur->next = l1;
    }
    if (l2 != NULL) {
        cur->next = l2;
    }

    struct ListNode *head = dummy->next;
    free(dummy);
    return head;
}
 类似资料:
  • 将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 我的链表合并以及排序的函数(mergeTwoLists)代码是哪里有问题吗,为什么我在VS上运行没报错,leetcode上运行就报错了 效果图片 leetcode报错图片

  • 21. Merge Two Sorted Lists 问题 Merge two sorted linked lists and return it as a new list. 思路 这个题目很简单也有几个可以考虑的思路,一个是比较直接的方式,重新构造链表,一种是利用递归 思路1 :用新的链表 这里用了一个新的节点了保存结果的链表,这里为了方便链表的扩充,增加一个临时的节点变量(否则每次加入都要遍

  • 合并排序通常是对链表排序的首选方式。链表缓慢的随机访问性能使得一些其他算法(如quicksort)表现不佳,而另一些算法(如heapsort)则完全不可能。我一直在努力在链表上做归并排序。它不断返回一个错误。我正在提供我试图执行的代码。请一定要帮我。它不断给出运行时错误。

  • NowCoder 题目描述 解题思路 递归 // java public ListNode Merge(ListNode list1, ListNode list2) { if (list1 == null) return list2; if (list2 == null) return list1; if (list1.val <= lis

  • 假设列表“A”是1- 请回顾一下这个,帮我即兴创作

  • 我试图用C语言合并排序列表。我在法语维基百科上看到了这里的代码,但它给了我一个不正确的列表(即未排序)。不过,该函数编译得很好。请注意,我并没有真正使用top,我可能很快就会把它从结构中去掉。你能帮我找出这个代码的错误吗?我必须把它从算法伪代码翻译成C代码。非常感谢。 是未排序的输入列表。是列表的长度。