合并两个单调不递减链表

这么写为什么不对啊 有希望改嘛 错在哪里了 初学者自学的 别提醒我30个字了

#include <bits/stdc++.h>

using namespace std;

typedef int ElemType;

typedef struct Link {
  ElemType Elem;
  struct Link *next;
} link;

link *CreatLink(int n) {
  link *head = (link *)malloc(sizeof(link));
  head->next = NULL;
  //创立头节点
  link *temp = head;
  //创立头指针指向头节点
  while (n--) {
    link *a = (link *)malloc(sizeof(link));
    scanf("%d", &a->Elem);
    a->next = NULL;
    temp->next = a;
    temp = a;
  }
  return head;
}

link *merge(link *l1, link *l2) {
  if (l1 == NULL)
    return l2;
  if (l2 == NULL)
    return l1;
  l1 = l1->next;
  l2 = l2->next;
  link *head = (link *)malloc(sizeof(link));
  head->next = NULL;
  //新头节点
  link *tail = head;
  //新头指针
  while (l1 && l2) {
    if (l1->Elem <= l2->Elem) {
      tail->next = l1;
      l1 = l1->next;
    } else {
      tail->next = l2;
      l2 = l2->next;
    }
    tail = tail->next;
  }
  //循环操作

  if (l1)
    tail->next = l1;
  if (l2)
    tail->next = l2;
  //最后必有一个原链表还剩下一串链表

  return head;
}

int main() {
  link *l1, *l2, *l3;
  int n1, n2;

  cout << "输入A链表表长及元素\n";
  scanf("%d", &n1);
  l1 = CreatLink(n1);

  cout << "输入B链表表长及元素\n";
  scanf("%d", &n2);
  l2 = CreatLink(n2);

  l3 = merge(l1, l2);
  cout << "合并后的C表为:\n";

  link *p = l3->next;
  while (p) {
    printf("%d ", p->Elem);
    p = p->next;
  }

  return 0;
}

运行结果:

img

代码如下,供参考:

#include<iostream>
using namespace std;
typedef int ElemType;

typedef struct Link {
    ElemType Elem;
    struct Link* next;
}link;

link* CreatLink(link* head, int n) {
    int i = 1;
    link* p = head;
    while (i <= n)
    {
        link* s = (link*)malloc(sizeof(link));
        scanf("%d", &s->Elem);
        s->next = NULL;
        p->next = s;
        p = p->next;
        i++;
    }
    return head->next;
}

link* merge(link* l1, link* l2) {
    link* head, *p, *s;
    head = (link*)malloc(sizeof(link));
    p = head;
    while (l1 != NULL || l2 != NULL)
    {
        s = (link*)malloc(sizeof(link));
        if (l1 != NULL && l1->Elem <= l2->Elem)
        {
            s->Elem = l1->Elem;
            l1 = l1->next;
        }
        else
        {
            s->Elem = l2->Elem;
            l2 = l2->next;
        }
        s->next = NULL;
        p->next = s;
        p = p->next;
    }
    return head->next;
}

int main()
{
    link* l1, * l2, * l3;
    int n1, n2;

    cout << "输入A链表表长及元素\n";
    scanf("%d", &n1);
    l1 = (link*)malloc(sizeof(link));
    l1 = CreatLink(l1, n1);

    cout << "输入B链表表长及元素\n";
    scanf("%d", &n2);
    l2 = (link*)malloc(sizeof(link));
    l2 = CreatLink(l2, n2);

    l3 = merge(l1, l2);
    cout << "合并后的C表为:" << endl;

    int n = n1 + n2;
    while (n--)
    {
        printf("%d ", l3->Elem);
        l3 = l3->next;
    }

    return 0;
}

 
#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
    int data;
    struct Node* next;
}Node_t;
 
//开辟节点并初始化
Node_t* AollcNode(int x)
{
    Node_t* p = (Node_t*)malloc(sizeof(Node_t));//新建一个节点
    //初始化
    p->data = x;
    p->next = NULL;
    return p;
}
//合并
void MergeList(Node_t* head, Node_t* head1, Node_t* head2)
{
    Node_t* p = head;
    Node_t* p1 = head1->next;//指向第一个节点
    Node_t* p2 = head2->next;//指向第一个节点
    while (p1 && p2)
    {
        if (p1->data <= p2->data)
        {
            p->next = p1;
            p1 = p1->next;
        }
        else
        {
            p->next = p2;         
            p2 = p2->next;
        }
        p = p->next;//指向新的节点,起到连接下一个节点的左右
    }
    //链表2还有数据
    if (p1 == NULL)
    {
        p->next = p2;
    }
    //链表1还有数据
    if (p2 == NULL)
    {
        p->next = p1;
    }
}
 
 
//尾插入创建链表
void InintList(Node_t** end)
{
    int i = 0;
    int x = 0;
    Node_t* p = NULL;
    printf("输入链表长度:>");
    int n = 0;
    scanf("%d", &n);
    for (; i < n; i++)
    {
        scanf("%d", &x);
        p = AollcNode(x);
        (*end)->next = p;
        *end = p;
    }
}
 
void ShowNode(Node_t* head)
{
    Node_t* p = head->next;
    while (p)
    {
        printf("%d->", p->data);
        p = p->next;
    }
    printf("NULL\n");
}
 
int main()
{
    Node_t* head1 = AollcNode(0);
    Node_t* head2 = AollcNode(0);
    Node_t* head3 = AollcNode(0);//合并后的tou
    printf("初始化链表1\n");
    Node_t* end1 = head1;
    //因为要记录结尾,要改变尾指针的指向要传址调用
    InintList( &end1);
    ShowNode(head1);
 
    printf("初始化链表2\n");
    Node_t* end2 = head2;
    //因为要记录结尾,要改变尾指针的指向要传址调用
    InintList(&end2);
    ShowNode(head2);
 
    printf("合并后:>");
    MergeList(head3, head1, head2);
    ShowNode(head3);
 
    free(head1);
    free(head2);
    free(head3);
    head1 = NULL;
    head2 = NULL;
    head3 = NULL;
 
 
    return 0;
}
 

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
typedef int ElemType;

typedef struct Link{
    ElemType Elem;
    struct Link *next;
}link;

link * CreatLink (int n) {
    link *head = (link *)malloc(sizeof(link));
    head->next = NULL;
    //创立头节点
    link *temp = head;
    //创立头指针指向头节点
    while(n--)
    {
        link *a = (link *)malloc(sizeof(link));
        scanf("%d",&a->Elem);
        a->next = NULL;
        temp->next = a;
        temp = temp->next;
    }
    return head;
}

link * merge (link *l1, link *l2) {
    if (l1 == NULL) return l2;
    if (l2 == NULL) return l1;
    link *head = (link *)malloc(sizeof(link));
    head->next = NULL;
    //新头节点
    link *tail = head;
    //新头指针
    while(l1 && l2)
    {
        if (l1->Elem <= l2->Elem)
        {
            tail->next = l1;
            l1 = l1->next;
        }
        else
        {
            tail->next = l2;
            l2 = l2->next;
        }
            tail = tail->next;
    }
    //循环操作

    if(l1) tail->next = l1;
    if(l2) tail->next = l2;
    //最后必有一个原链表还剩下一串链表

    return head->next;
}

int main ()
{
    link *l1,*l2,*l3;
    int n1,n2;

    cout << "输入A链表表长及元素\n";
    scanf("%d",&n1);
    l1 = CreatLink (n1);

    cout << "输入B链表表长及元素\n";
    scanf("%d",&n2);
    l2 = CreatLink (n2);

    l3 = merge(l1->next,l2->next);
    cout << "合并后的C表为:\n";

    while(l3)
    {
        printf("%d ",l3->Elem);
        l3 = l3->next;
    }

    return 0;
}

代码呢?

#include <bits/stdc++.h>
using namespace std;
typedef int ElemType;

typedef struct Link{
ElemType Elem;
struct Link *next;
}link;

link * CreatLink (int n) {
link *head = (link *)malloc(sizeof(link));
head->next = NULL;
//创立头节点
link *temp = head;
//创立头指针指向头节点
while(n- -)
{
link *a = (link *)malloc(sizeof(link));
scanf("%d",&a->Elem);
a->next = NULL;
temp->next = a;
temp = temp->next;
}
return head;
}

link * merge (link *l1, link *l2) {
if (l1 == NULL) return l2;
if (l2 == NULL) return l1;
link *head = (link *)malloc(sizeof(link));
head->next = NULL;
//新头节点
link *tail = head;
//新头指针
while(l1 && l2)
{
if (l1->Elem <= l2->Elem)
{
tail->next = l1;
l1 = l1->next;
}
else
{
tail->next = l2;
l2 = l2->next;
}
tail = tail->next;
}
//循环操作

if(l1) tail->next = l1;
if(l2) tail->next = l2;
//最后必有一个原链表还剩下一串链表

return head->next;
}

int main ()
{
link *l1,*l2,*l3;
int n1,n2;

cout << "输入A链表表长及元素\n";
scanf("%d",&n1);
l1 = CreatLink (n1);

cout << "输入B链表表长及元素\n";
scanf("%d",&n2);
l2 = CreatLink (n2);

l3 = merge(l1,l2);
cout << “合并后的C表为:\n”;

while((n1+n2) - -)
{
printf("%d ",l3->Elem);
l3 = l3->next;
}

return 0;
}