合并两个有序链表

#include <stdio.h>
#include <stdlib.h>

struct list
{
    int data;
    struct list *next;
};

typedef struct list L;

L *insert (L *head, int data)//尾插
{
    L *new = calloc(1, sizeof(L));
    new->data = data;
    new->next = NULL;

    if(head == NULL)
        head = new;
    else
    {
        L *tmp = head;
        while(tmp->next != NULL)
        {
            tmp = tmp->next;
        }
        tmp->next = new;
    }
    return head;

}

L *mergeList(L *head1, L *head2)//合并
{
    L *merge = NULL;
    L *node1 = head1;
    L *node2 = head2;
    //先找到新链表的头
    if(head1 == NULL && head2 == NULL)
        return merge;
    else if (head1 == NULL && head2 != NULL)
        return head2;
    else if (head2 == NULL && head1 != NULL)
        return head1;
    else
    {   
        if(head1->data >= head2->data)
        {   
            merge = head2;
            head2 = head2->next;
        }   
        else
        {   
            merge = head1;
            head1 = head1->next;
        }   
            }


    L *tmp = merge;
    //比较两个链表的首个节点 然后将data较小的节点插入到新链表中
    //如果在比较当中某个链表已经遍历完,则直接将另个链表直接插入到新链表中
    while(head1 != NULL || head2 != NULL)
    {
        if (head1 == NULL && head2 != NULL)
        {
            tmp->next = head2;
            break;
        }
        else if(head2 == NULL && head1 != NULL)
        {
            tmp->next = head1;
            break;
        }
        else
        {
            if (head1->data >= head2->data)
            {
                tmp->next = head2;
                head2 = head2->next;
            }
            else
            {
                tmp->next = head1;
                head1 = head1->next;
            }
        }
        tmp = tmp->next;
    }

    return merge;
}

void travel(L *head)
{
    L *node = head;
    while(node!= NULL)
    {
        printf("data:%d\n", node->data);
        node = node->next;
    }

    return;
}

int main()
{
    L *head1 = NULL;
    L *head2 = NULL;
    L *head3 =  NULL;
   
    int i = 0;
    for(i = 0; i < 10; i = i + 2)
    {
        head1 = insert(head1, i);
    }

    for(i = 1; i < 20; i = i + 2)
    {
        head2 = insert(head2, i);
    }

    travel(head1);
    printf("\n");
    travel(head2);
    printf("\n");

    head3 = mergeList(head1, head2);

    travel(head3);

    return 0;
}
                                        

输出

data:0
data:2
data:4
data:6
data:8

data:1
data:3
data:5
data:7
data:9
data:11
data:13
data:15
data:17
data:19

data:0
data:1
data:2
data:3
data:4
data:5
data:6
data:7
data:8
data:9
data:11
data:13
data:15
data:17
data:19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值