niithub

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个递增的整数序列。

函数接口定义:

List Merge( List L1, List L2 );

其中List结构定义如下:

typedef struct Node *PtrToNode;
struct Node {
    ElementType Data; /* 存储结点数据 */
    PtrToNode   Next; /* 指向下一个结点的指针 */
};
typedef PtrToNode List; /* 定义单链表类型 */

L1L2是给定的带头结点的单链表,其结点存储的数据是递增有序的;函数Merge要将L1L2合并为一个递增的整数序列。应直接使用原序列中的结点,返回归并后的链表头指针。

裁判测试程序样例:

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

typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
    ElementType Data;
    PtrToNode   Next;
};
typedef PtrToNode List;

List Read(); /* 细节在此不表 */
void Print( List L ); /* 细节在此不表;空链表将输出NULL */

List Merge( List L1, List L2 );

int main()
{
    List L1, L2, L;
    L1 = Read();
    L2 = Read();
    L = Merge(L1, L2);
    Print(L);
    Print(L1);
    Print(L2);
    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

3
1 3 5
5
2 4 6 8 10

输出样例:

1 2 3 4 5 6 8 10 
NULL
NULL

=============================================
第一次code:
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 typedef int ElementType;
 5 typedef struct Node *PtrToNode;
 6 struct Node {
 7     ElementType Data;
 8     PtrToNode   Next;
 9 };
10 typedef PtrToNode List;
11 
12 List Read(); /* 细节在此不表 */
13 void Print( List L); /* 细节在此不表;空链表将输出NULL */
14 
15 List Merge( List L1, List L2 );
16 
17 int main()
18 {
19     List L1, L2, L;
20     L1 = Read();
21     L2 = Read();
22     L = Merge(L1, L2);
23     Print(L);
24     Print(L1);
25     Print(L2);
26     return 0;
27 }
28 List Read()  
29 {  
30     int i,n;  
31     scanf("%d",&n);
32     List p,q,L;  
33     L=(List)malloc(sizeof(PtrToNode));  
34     L->Next=NULL;//建立头结点  
35     q=L;  
36     for (i=1;i<=n;i++)  
37     {
38         p=(List)malloc(sizeof(PtrToNode));  
39         scanf("%d",&p->Data);  
40         q->Next=p;  
41         q=q->Next;//q后移  
42     }  
43     p->Next=NULL;//最后一个节点是尾结点  
44     return L;
45 }  
46 void Print( List L) 
47 {  
48     List p=L->Next;//指向第一个结点  
49     if(p==NULL)  
50     {  
51         printf("NULL"); 
52         printf("\n"); 
53         return;  
54     } 
55     while(p)  
56     {  
57       printf("%d ",p->Data);  
58       p=p->Next;  
59     }  
60     printf("\n"); 
61 }  
62 List Merge( List L1, List L2)
63 {  
64     List L, p1, p2,tail;  
65     L=(List)malloc(sizeof(PtrToNode)); 
66     p1=L1->Next;
67     p2=L2->Next;
68     tail=L;
69     while(p1 && p2)
70     {
71         if(p1->Data < p2->Data)//链上data值小的
72         {
73             tail->Next=p1;
74             tail=p1;
75             p1=p1->Next;
76             L1->Next=NULL;
77             L2->Next=NULL;
78         }
79         else
80         {
81             tail->Next=p2;
82             tail=p2;
83             p2=p2->Next;
84             L1->Next=NULL;
85             L2->Next=NULL;
86         }
87     }
88     if(p1)
89     {
90         tail->Next=p1;
91     }
92     else
93     {
94         tail->Next=p2;
95     }
96     return L;
97 }  

posted on 2016-09-18 16:40  niithub  阅读(483)  评论(1编辑  收藏  举报