合并两个有序的链表为一个有序的链表

#include <stdio.h>

#include <stdarg.h>

#include <malloc/malloc.h>


typedef struct node

{

    int data;

    structnode *next;

}ListNode;


//递归算法参考剑指offer(纪念版) p116

ListNode *merge(ListNode *head1,ListNode *head2)

{

    ListNode *mergeHead =NULL;

    if (head1 == NULL) {

        return head2;

    } else if (head2 == NULL) {

        return head1;

    }

    

    if (head1 -> data < head2 ->data) {

        mergeHead = head1;

        mergeHead -> next =merge(head1 ->next, head2);

    } else {

        mergeHead = head2;

        mergeHead -> next =merge(head1, head2 ->next);

    }

    return mergeHead;

}


//参考 C Primer Plus (第五版) p480

ListNode *new(int lim,...)//参数个数指定为lim

{

    va_list ap;

    ListNode *head =NULL;

    ListNode *p =NULL;

    int i;

    va_start(ap, lim);

    for (i = 0; i < lim; i++) {

        ListNode *new ;

        new = (ListNode *)malloc(sizeof(ListNode));

        if (new != NULL) {

            if (head == NULL) {

                head = new;

            } else {

                p -> next = new;

            }

            new -> data =va_arg(ap,int);

            p = new;

        }

    }

    va_end(ap);

    return head;

}


int main(int argc,constchar * argv[]) {

    

    //创建两个有序链表

    ListNode *n1 =new(7,1,3,5,7,9,11,13);

    ListNode *n2 =new(7,2,4,6,8,10,12,14);

    

    //合并成一个有序链表

    ListNode *mer =merge(n1, n2);

    

    //输出合并之后的链表中的元素

    while (mer != NULL) {

        printf("%d  ",mer ->data);

        mer = mer ->next;

    }

    return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

0010000100

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值