平台:win10 x64 +VC6.0
2019/5/22
1.合并三个有序的链表
链表节点定义
struct node
{
int val;
struct node* next;
};
struct node* merge_3 (形参由你定义)
{
//这部分是实现
}
当输入的有序链表是多个的时候,请给出合并算法,并假设链表个数为m,平均长度为n,请分析时间复杂度
思路:参看 https://blog.csdn.net/wwxy1995/article/details/82120194
1 #include <stdio.h> 2 #include <stdlib.h> 3 #define MAXSIZE 20 4 5 typedef int ElemType; 6 typedef struct Node 7 { 8 ElemType data; 9 struct Node *next; 10 11 }Node; 12 13 typedef struct Node *LinkList; 14 15 // 初始化链表 16 bool InitList(LinkList *L) // 二级指针 17 { 18 *L = (LinkList)malloc(sizeof(Node)); //产生头结点,并使L指向此头节点 19 if (!(*L)) // 存储分配失败 20 return false; 21 (*L)->next = NULL; 22 return true; 23 } 24 void CreateFromTail(LinkList L) 25 { 26 Node *r, *s; 27 int temp; 28 r = L; // r指向链表的当前表尾,其初值指向头节点 29 while (1) 30 { 31 scanf("%d", &temp); 32 if (temp == -1) 33 { 34 r->next = NULL; 35 break; 36 } 37 s = (Node*)malloc(sizeof(Node)); // 建立新结点s 38 s->data = temp; 39 r->next = s; 40 r = s; 41 42 } 43 } 44 45 // 遍历链表 46 void PrintList(LinkList L) 47 { 48 bool flag = true; 49 Node *p; 50 p = L->next; 51 while (p) 52 { 53 if (flag) 54 { 55 printf("%d", p->data); 56 flag = false; 57 } 58 else 59 printf(" %d", p->data); 60 p = p->next; 61 } 62 printf("\n"); 63 } 64 65 LinkList MergeLinkList(LinkList L1, LinkList L2) 66 { 67 LinkList L3; 68 InitList(&L3); 69 70 Node *p, *q, *r, *s; 71 p = L1->next; 72 q = L2->next; 73 r = L3; 74 while (p&&q) 75 { 76 if (p->data < q->data) 77 { 78 s = (Node*)malloc(sizeof(Node)); 79 s->data = p->data; 80 s->next = NULL; 81 r->next = s; 82 r = s; 83 p = p->next; 84 } 85 else 86 { 87 s = (Node*)malloc(sizeof(Node)); 88 s->data = q->data; 89 s->next = NULL; 90 r->next = s; 91 r = s; 92 q = q->next; 93 } 94 } 95 96 if (p == NULL) 97 { 98 r->next = q; 99 } 100 if (q == NULL) 101 { 102 r->next = p; 103 } 104 return L3; 105 } 106 107 int main() 108 { 109 LinkList L1,L2,L3,L4; 110 InitList(&L1); // 指针的地址 111 InitList(&L2); // 指针的地址 112 InitList(&L3); // 指针的地址 113 InitList(&L4); // 指针的地址 114 CreateFromTail(L1); 115 PrintList(L1); 116 CreateFromTail(L2); 117 PrintList(L2); 118 CreateFromTail(L3); 119 PrintList(L3); 120 L4 = MergeLinkList(L1, L2); 121 PrintList(L4); 122 L4 = MergeLinkList(L3, L4); 123 PrintList(L4); 124 if (L4->next) 125 PrintList(L4); 126 else 127 printf("NULL\n"); 128 129 }