剑指offer 编程题(15):链表合并

来源:互联网 发布:网络教育专业选择 编辑:程序博客网 时间:2024/05/29 18:34

题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

/*struct ListNode {    int val;    struct ListNode *next;    ListNode(int x) :            val(x), next(NULL) {    }};*/class Solution {public:    ListNode* Merge(ListNode* pHead1, ListNode* pHead2)    {         if(pHead1==nullptr)         {             return pHead2;         }         if(pHead2==nullptr)         {             return pHead1;         }                ListNode* res=nullptr;        if(pHead1->val>=pHead2->val)        {            res=pHead2;            res->next=Merge(pHead1,pHead2->next);        }        else        {            res=pHead1;            res->next=Merge(pHead1->next,pHead2);        }        return res;    }};
/*struct ListNode {    int val;    struct ListNode *next;    ListNode(int x) :            val(x), next(NULL) {    }};*/class Solution {public:    ListNode* Merge(ListNode* pHead1, ListNode* pHead2)    {        ListNode *p=new ListNode(0);        *q=p;//两个指针都指向合成后新链表头节点,p用来做插入,q用来保存头结点地址        if(!pHead1)        return pHead2;        if(!pHead2)        return pHead1; //若有某一个链表为空,则返回另一个        while(1)        {              if(pHead1->val<pHead2->val)            {                p->val=pHead1->val; //如果L1值小,则L1向下走                pHead1=pHead1->next;            }           else            {                p->val=pHead2->val; //如果L2值小,则L2向下走                pHead2=pHead2->next;            }            if(pHead1==NULL||pHead2==NULL) //若某个链表走完,则跳出            break;            p->next=new ListNode(0); //不断增加合成后链表的节点            p=p->next;        }        if(!pHead1)        p->next=pHead2;        if(!pHead2)        p->next=pHead1; //若某个链表走完,则将另一个链表续在合成后链表的末尾        return q;    }};