合并两个排序的单链表

来源:互联网 发布:linux6 域名对应多个ip 编辑:程序博客网 时间:2024/06/14 14:54

【题目】

输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是按照递增排序的。


【分析】

合并单链表,需要找到头结点,对比两个链表头结点后,确定头结点,再确定头结点下一个结点,循环递归的如前面一样操作确定每个结点位置,同时考虑边界条件,如果两个链表为空,则肯定无需合并了,就是空链表,如果一个链表为空,另一个不为空,则返回不为空的链表。具体分析流程可以看下面的例子:

这里写图片描述


【测试代码】

#include<stdio.h>#include<stdlib.h>#include<stack>typedef int data_type;typedef struct Node node_t;// 给struct Node取个别名node_ttypedef struct Node * node_ptr;//给struct Node*取个别名node_ptrtypedef struct Node{    data_type data;    struct Node *node_next;//node_next是一个指向结构的指针,告诉指针要指向的地址就要付给它一个结构类型地址};//链表初始化node_t * init(){    node_ptr p;    p = (node_t *)malloc(sizeof(node_t));    p->node_next = NULL;    return p;}//在链表后面插入结点node_t *insert_back(node_ptr p , data_type data){    node_ptr pnew = (node_t *)malloc(sizeof(node_t));    pnew ->node_next = NULL;    pnew ->data = data;    p->node_next = pnew;    return pnew;}node_t * merge(node_ptr list1_head, node_ptr list2_head){    if(list1_head == NULL)        return list2_head;    else if(list2_head == NULL)        return list1_head;    node_ptr merge_head = NULL;    if(list1_head ->data < list2_head->data)    {        merge_head = list1_head;        merge_head->node_next  = merge(list1_head->node_next,list2_head);    }    else    {        merge_head = list2_head;        merge_head->node_next = merge(list1_head, list2_head->node_next);    }    return merge_head;}//正常打印void print(node_ptr p){    if(!p)    {            printf("no data, you think too much");            return ;    }    node_ptr list = p;    while(list->node_next != NULL)    {        printf("%d ", list->data);        list = list->node_next;    }    printf("%d ",list->data);    printf("\n");}void main(){    node_ptr pnode1,pnode2, list1,list2;    pnode1 = init();    pnode2 = init();    list1 = pnode1;    list2 = pnode2;    pnode1 = insert_back(pnode1, 1);    pnode1 = insert_back(pnode1, 3);    pnode1 = insert_back(pnode1, 5);    pnode2  = insert_back(pnode2 , 2);    pnode2  = insert_back(pnode2 , 4);    pnode2  = insert_back(pnode2 , 6);    printf("单链表1为:");    print(list1->node_next);    printf("其头结点元素为:%d\n", list1->node_next->data);    printf("单链表2为:");    print(list2->node_next);    printf("其头结点元素为:%d\n", list2->node_next->data);    printf("\n");    node_t *merge_list = merge(list1->node_next, list2->node_next);    printf("合并单链表顺序为:");    print(merge_list);    printf("头结点元素为:%d\n",merge_list->data);    printf("\n");}

【输出】
这里写图片描述

0 0