合并两个有序链表

1.合并两个有序链表,合并以后的链表依旧有序。

合并两个有序链表,可以分为以下几种情况:
a)当要合并的两条链表都为空,返回空;
b)当一个链表为空;此时我们直接返回好另一条链表即可;
c)都不为空,两个链表进行合并;
在此中由于我们不知道链表1和链表2应该以谁为头,因此.我们自己定义新链表的头;然后注意进行比较,逐次向表头链接;
当其中一个链接完成后,由于其有序,直接将后一个没有连完挂在后面即可.
下面为代码:
#include <iostream>
#include <assert.h>
using namespace std;

typedef struct ListNode
{
    int _data;
    struct ListNode* _next; 
    ListNode(const int x)
        :_data(x)
        ,_next(NULL)
    {}
}ListNode;

void Push(ListNode** list,int x)
{
    assert(list);
    ListNode* tmp = new ListNode(x);
    if (*list == NULL)          //没有元素
    {
        *list = tmp;
    }
    else
    {
        ListNode* cur = *list;
        while (cur->_next)    //
        {
            cur = cur->_next;
        }
        cur->_next = tmp;
    }
}

ListNode* ListMerge(ListNode* l1,ListNode* l2)  
{  
    if(l1 == NULL)   
    {
        return l2; 
    }
    if(l2 == NULL)
    {
        return l1;  
    }
    ListNode* head = NULL;   //合并后的头指针  
    ListNode* p1 = l1;    //p1用于扫描链表1  
    ListNode* p2 = l2; //p2用于扫描链表2

    if(l1->_data < l2->_data)     //确定头
    {  
        head=l1;  
        p1=l1->_next;  
    }  
    else  
    {  
        head=l2;  
        p2=l2->_next;  
    }

    ListNode* p=head;   //p永远指向最新合并的结点 

    while(p1 && p2)      //如果循环停止,则p1或p2至少有一个为NULL  
    {  
        if(p1->_data < p2->_data)  
        {  
            p->_next=p1;  
            p1=p1->_next;  
        }  
        else  
        {  
            p->_next=p2;  
            p2=p2->_next;  
        }  
        p=p->_next;  
    }  
    if(p1 != NULL)//如果链1还没走完  
    {  
        p->_next=p1;  
    }  
    else if(p2 != NULL)//如果链2还没走完  
    {  
        p->_next=p2;  
    }  
    return head;  
}  


int main()
{
    ListNode* l1 = NULL;
    Push(&l1,1);
    Push(&l1,3);
    Push(&l1,5);
    Push(&l1,7);
    Push(&l1,9);
    ListNode* l2 = NULL;
    Push(&l2,2);
    Push(&l2,4);
    Push(&l2,6);
    Push(&l2,8);
    Push(&l2,10);
    ListNode* a = ListMerge(l1,l2);
    while (a)
    {
        cout<<a->_data<<" ";
        a = a->_next;
    }
    cout<<endl;

    return 0;
}

2.实现1+2+3…+n,要求不能使用乘除法、循环、条件判断、选择相关的关键字。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值