平台: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 }
合并三个有序的链表

相关文章:

  • 2022-02-18
  • 2022-12-23
  • 2022-12-23
  • 2022-02-07
  • 2021-05-18
  • 2021-12-07
  • 2021-05-21
猜你喜欢
  • 2022-12-23
  • 2022-02-15
  • 2021-10-24
  • 2021-10-25
  • 2021-10-09
  • 2022-12-23
  • 2021-07-21
相关资源
相似解决方案