两个有序链表序列的合并

Posted onlyblues

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了两个有序链表序列的合并相关的知识,希望对你有一定的参考价值。

两个有序链表序列的合并

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

函数接口定义:

List Merge( List L1, List L2 );

其中 List 结构定义如下:

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

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

裁判测试程序样例:

#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

 

解题思路

  AC代码:

 1 List Merge(List L1, List L2) {
 2     List head = (List)malloc(sizeof(struct Node));
 3     head->Next = NULL;
 4     List p = head, p1 = L1->Next, p2 = L2->Next;
 5     
 6     while (p1 && p2) {
 7         if (p1->Data < p2->Data) {
 8             p = p->Next = p1;
 9             p1 = p1->Next;
10         }
11         else {
12             p = p->Next = p2;
13             p2 = p2->Next;
14         }
15     }
16     p->Next = p1 ? p1 : p2;
17     
18     L1->Next = L2->Next = NULL;
19     
20     return head;
21 }

  补充省略的代码,完整程序如下:

 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 
29 List Merge(List L1, List L2) {
30     List head = (List)malloc(sizeof(struct Node));
31     head->Next = NULL;
32     List p = head, p1 = L1->Next, p2 = L2->Next;
33 
34     while (p1 && p2) {
35         if (p1->Data < p2->Data) {
36             p = p->Next = p1;
37             p1 = p1->Next;
38         }
39         else {
40             p = p->Next = p2;
41             p2 = p2->Next;
42         }
43     }
44     p->Next = p1 ? p1 : p2;
45 
46     L1->Next = L2->Next = NULL;
47 
48     return head;
49 }
50 
51 List Read() {
52     List L = (List)malloc(sizeof(struct Node));
53     L->Next = NULL;
54     List p = L;
55 
56     int n;
57     scanf("%d", &n);
58     for (int i = 0; i < n; i++) {
59         List tmp = (List)malloc(sizeof(struct Node));
60         scanf("%d", &tmp->Data);
61         tmp->Next = NULL;
62         p = p->Next = tmp;
63     }
64 
65     return L;
66 }
67 
68 void Print(List L) {
69     L = L->Next;
70     if (L == NULL) {
71         printf("NULL\\n");
72         return;
73     }
74 
75     while (L) {
76         printf("%d ", L->Data);
77         L = L->Next;
78     }
79     printf("\\n");
80 }

以上是关于两个有序链表序列的合并的主要内容,如果未能解决你的问题,请参考以下文章

两个有序链表序列的合并

PTA 两个有序链表序列的合并

7-51 两个有序链表序列的合并 (20分)

02-线性结构1 两个有序链表序列的合并

两个有序链表序列的合并

02-线性结构1 两个有序链表序列的合并