合并两个有序链表

题目与代码

题目:合并两个有序链表

#include
#include

typedef struct DataNode {
    int data;
    struct DataNode *next;
}node;



void createLinkedTable(node* head,int dataInArray[],int numberInArray);
node* getMergeLinkedTable(node* firstTableNode,node* secondTableNode);


int main(int argc, char *argv[])
{
    node *firstLinkedTableHead = (node *) malloc(sizeof(node));
    int firstArray[5] = {1,4,6,13,20};
    // 将有序数组数组转化成链表
    createLinkedTable(firstLinkedTableHead,firstArray,5);
    node *travelNode = firstLinkedTableHead;
    printf("第一个链表数据:");
    // 输出第一个链表数据
    while(travelNode!=NULL){
        printf("%d\t",travelNode->data);
        travelNode = travelNode->next;
    }
    printf("\n");
    node *secondLinkedTableHead = (node *) malloc(sizeof(node));
    int secondArray[4] = {9,12,17,18};
    // 将有序数组数组转化成链表
    createLinkedTable(secondLinkedTableHead,secondArray,4);
    travelNode = secondLinkedTableHead;
    printf("第二个链表数据:");
    // 输出第二个链表数据
    while(travelNode!=NULL){
        printf("%d\t",travelNode->data);
        travelNode = travelNode->next;
    }
    printf("\n");
    node* mergeLinkedTable = getMergeLinkedTable(firstLinkedTableHead,secondLinkedTableHead);
    travelNode = mergeLinkedTable;
    // 输出合并后的链表
    while(travelNode!=NULL){
        printf("%d\t",travelNode->data);
        travelNode = travelNode->next;
    }
    printf("\n");
}
// 把数组转化成链表
void createLinkedTable(node* head,int dataInArray[],int numberInArray){
    node *tempNode = NULL;
    for(int i=0;i<numberInArray;i++){
        node* newNode = (node *) malloc(sizeof(node));
        newNode->data = dataInArray[i];
        newNode->next = NULL;
        if(tempNode == NULL){
            head->next = NULL;
            head->data = newNode->data;
            tempNode = head;
        }else{
            tempNode->next = newNode;
        }
        if(tempNode -> next != NULL){
            tempNode = tempNode -> next;
        }
    }
}
//进行有序列表的合并
node* getMergeLinkedTable(node* firstTableNode,node* secondTableNode){
    node* mergeLinkedTableHead = NULL;
    node* travelNode = NULL;
    while(firstTableNode!=NULL && secondTableNode!=NULL){
        if(mergeLinkedTableHead == NULL){
            if(firstTableNode->data < secondTableNode->data){
                mergeLinkedTableHead = firstTableNode;
                firstTableNode = firstTableNode->next;
            }else{
                mergeLinkedTableHead = secondTableNode;
                secondTableNode = secondTableNode->next;
            }
            travelNode = mergeLinkedTableHead;
        }else{
            if(firstTableNode->data < secondTableNode->data){
                travelNode->next = firstTableNode;
                firstTableNode = firstTableNode->next;
            }else{
                travelNode->next = secondTableNode;
                secondTableNode = secondTableNode->next;
            }
            travelNode = travelNode->next;
        }
    }
    if(firstTableNode==NULL){
        travelNode->next = secondTableNode;
    }else{
        travelNode->next = firstTableNode;
    }
    return mergeLinkedTableHead;
}

图解

getMergeLinkedTable函数代码:

node* mergeLinkedTableHead = NULL;
node* travelNode = NULL;

执行之后如下图:
合并两个有序链表_第1张图片

getMergeLinkedTable函数中while循环第1次执行完成后,如下图:
合并两个有序链表_第2张图片

getMergeLinkedTable函数中while循环第2次执行完成后,如下图:
合并两个有序链表_第3张图片

getMergeLinkedTable函数中while循环第3次执行完成后,如下图:
合并两个有序链表_第4张图片

getMergeLinkedTablewhile循环第4次执行完成后,如下图:
合并两个有序链表_第5张图片

getMergeLinkedTablewhile循环第5次执行完成后,如下图:
合并两个有序链表_第6张图片

getMergeLinkedTablewhile循环第6次执行完成后,如下图:
合并两个有序链表_第7张图片

getMergeLinkedTablewhile循环第7次执行完成后,如下图:
合并两个有序链表_第8张图片

getMergeLinkedTablewhile循环第8次执行完成后,如下图:
合并两个有序链表_第9张图片
因为secondTableNode==NULL,所以不能执行while里边的代码。getMergeLinkedTable函数代码:

if(firstTableNode==NULL){
        travelNode->next = secondTableNode;
    }else{
        travelNode->next = firstTableNode;
    }

执行之后如下图:
合并两个有序链表_第10张图片

你可能感兴趣的:(数据结构和算法,ARTS打卡,链表,算法,数据结构)