两个有序单链表的合并

#include <iostream>
using namespace std;

#define OK    (1)
#define ERROR (0)

typedef int Status;
typedef int ElemType;
int length = 0;//链表长度 
typedef struct LNode {
    ElemType data;
    LNode* next;
} LNode;


//初始化空单链表
LNode* init()
{
    LNode* head = new(LNode);//头指针
    head->next = NULL;
    head->data = 0;
    length = 0;
    return head;
}

//销毁
Status destroy(LNode* l)
{
    LNode* q = NULL;
    while (q)
    {
        q = l;
        l = l->next;
        delete q;
        q = NULL;
    }
    return OK;
}

Status travel(LNode* l)
{
    LNode* p = l->next;
    while (p != NULL) {
        cout << p->data;
        if (p->next != NULL)
            cout << "->";

        p = p->next;
    }
    cout << endl;
    return OK;
}

//插入
Status insert(LNode* l, int i, ElemType e)
{
    LNode* p = new(LNode);
    p->next = NULL;
    p->data = e;
    if (l->next == NULL)
    {
        l->next = p;
        length++;
        return OK;
    }
    else
    {
        LNode* q = l;
        while (q->next)
        {
            q = q->next;
        }
        q->next = p;
        length++;
    }
    return OK;
}

// 删除指定位置i的节点
Status remove(LNode* l, int i)
{
    LNode* p = l, * q = l->next;
    int j;
    if (i == 0)
    {
        p->next = q->next;
        delete q;
        return OK;
    }
    for (j = 0; j < length; j++)
    {
        q = p;
        p = p->next;
        if (j == i)
        {
            q = p->next;
            delete p;
            return OK;
        }
    }

}

// 删除指定值为e的全部
Status removeKey(LNode* l, ElemType e)
{
    LNode* p = l, * q = l;
    while (p)
    {
        if (p->data == e)
        {
            q->next = p->next;
            delete p;
            return OK;
        }
        else
        {
            q = p;
            p = p->next;
        }
    }
}

//根据x查找节点所在位置
int locate(LNode* l, ElemType x)
{
    LNode* p = l;
    for (int i = 0; i < length; i++)
    {
        p = p->next;
        if (p->data == x)
        {
            return i + 1;
        }
    }
}

//根据位置i找到数据并存储至变量e
Status get(LNode* l, int i, ElemType& e)
{
    LNode* p = l;
    for (int j = 0; j < length; j++)
    {
        p = p->next;
        if (j == i)
        {
            e = p->data;
            return OK;
        }
    }
}
//合并连个有序链表
LNode* mergerTwoSortedList(LNode* head1, LNode* head2) {

    LNode* head = new LNode();//head指针是每次后移的
    LNode* firstNode = head;//需要确定好一个不变的头结点,然后返回这个头结点的next地址,才能返回完成的链表

    while (head1 != NULL && head2 != NULL) {
        if (head1->data > head2->data) {
            head->next = head2;//这里只是确定好head->next是哪个结点,head还没有指向这个结点
            head2 = head2->next;
        }
        else {
            head->next = head1;
            head1 = head1->next;
        }
        head = head->next;//head指向这个结点
    }

    head->next = head1 ? head1 : head2;//遇到一个为空后,哪个不为空就next指向哪一个
    return firstNode->next;
}

int main()
{
	//初始化
	LNode* l = init();
	LNode* z = init();
	insert(l, 1, 1);
	insert(l, 2, 3);
	insert(l, 3, 5);
	insert(l, 4, 7);
	insert(l, 5, 9);
	travel(l);
	insert(z, 1, 2);
	insert(z, 2, 4);
	insert(z, 3, 6);
	insert(z, 4, 8);
	insert(z, 5, 10);
	insert(z, 6, 12);
	insert(z, 7, 13);
	insert(z, 8, 14);
	travel(z);
    LNode* p = mergerTwoSortedList(l, z);//调用函数
    p=p->next;
	travel(p);
	return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

狗蛋儿l

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

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

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

打赏作者

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

抵扣说明:

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

余额充值