剑指Offer——有序链表的合并

题目:将两个递增的单链表合并成一个递增的单链表

可以用递归和循环两种方法实现。

//剑指Offer:两个递增的单链表,合并成一个递增的单链表
#include <iostream>

using namespace std;
struct ListNode
{
    int val;
    ListNode *next;
};

//方法一:递归,另建一个新的链表,存储值
ListNode *Merge1(ListNode *phead1,ListNode *phead2)
{
    //鲁棒性检查,防止程序访问到NULL指针,出现崩溃
    if(phead1==NULL)
        return phead2;
    if(phead2==NULL)
        return phead1;
    ListNode *phead;

    if(phead1->val>phead2->val)
    {
        phead=phead2;
        phead->next=Merge1(phead1,phead2->next);
    }
    else
    {
        phead=phead1;
        phead->next=Merge1(phead1->next,phead2);
    }
    return phead;
}
//方法二:循环法,将链表2插入到链表1中
ListNode *Merge2(ListNode *phead1,ListNode *phead2)
{
    ListNode *p,*r,*q,*s;
    p=phead1;  r=p->next;
    q=phead2->next; s=q->next;//当链表2的节点插入后,保存后继节点。

    while(r!=NULL&&q!=NULL)
    {
       if(r->val<=q->val)
       {
           p=r;
           r=r->next;
       }else
       {
         q->next=p->next;
         p->next=q;//将q指向节点插到p

         p=q;
         q=s;
         s=s->next;
       }
    }
    if(r==NULL) p->next=q;
    return p;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值