1. 程式人生 > >7-15 兩個有序鏈表序列的合並(20 分)

7-15 兩個有序鏈表序列的合並(20 分)

一行 htm text all color div 兩個 turn nbsp

已知兩個非降序鏈表序列S1與S2,設計函數構造出S1與S2的並集新非降序鏈表S3。

輸入格式:

輸入分兩行,分別在每行給出由若幹個正整數構成的非降序序列,用1表示序列的結尾(1不屬於這個序列)。數字用空格間隔。

輸出格式:

在一行中輸出合並後新的非降序鏈表,數字間用空格分開,結尾不能有多余空格;若新鏈表為空,輸出NULL

輸入樣例:

1 3 5 -1
2 4 6 8 10 -1

輸出樣例:

1 2 3 4 5 6 8 10


代碼:

#include <stdio.h>
#include <stdlib.h>
#include 
<string.h> typedef struct Node *Node; struct Node { int data; Node Next; }; Node CList() { int d; Node head = (Node)malloc(sizeof(struct Node)),q; head -> Next = NULL; q = head; while(~scanf("%d",&d)&&d!=-1) { Node p = (Node)malloc
(sizeof(struct Node)); p -> data = d; p -> Next = NULL; q -> Next = p; q = p; } return head; } Node Merge(Node a,Node b) { a = a -> Next; b = b -> Next; Node head = (Node)malloc(sizeof(struct Node)); head -> Next = NULL; Node q
= head; while(a || b) { Node p = (Node)malloc(sizeof(struct Node)); p -> Next = NULL; if(a == NULL || a -> data > b -> data) { p -> data = b -> data; b = b -> Next; q -> Next = p; q = p; } else { p -> data = a -> data; a = a -> Next; q -> Next = p; q = p; } } return head; } void printL(Node a) { a = a -> Next; if(a == NULL)printf("NULL"); int flag = 0; while(a) { if(flag)printf(" %d",a -> data); else printf("%d",a -> data); a = a -> Next; flag = 1; } } int main() { Node a = CList(); Node b = CList(); Node c = Merge(a,b); printL(c); }

7-15 兩個有序鏈表序列的合並(20 分)