剑指offer-刷题笔记-简单题-JZ25 合并两个排序的链表

剑指offer-刷题笔记-简单题-JZ25 合并两个排序的链表

思想是先对比,把两个链表合并到一起,注意最后可能会出现一个链表刚好结束,另一个链表还有剩余节点,因为链表是递增的,把,另一个链表的剩余值都链接到末尾
版本 1是自己写的,只能通过部分例子,只是对应位置单个的对比,比如{1,3,5},{2,4,6},1与2对比,3与4对比,5,6对比,比如{1,2,3},{2,4,6}就会出问题,最开始想到这个,打算用两个循环,即当前链表和下一个链表的所有节点都对比一遍,但是时间复杂度过高。版本2这里是通过只动一个节点实现的,链表1第一个节点的值较小,链接到链表1第一节点,链表1移动到第2个节点,链表2还在第一个节点,同样的可以实现多个节点的对比。最后还用了条件表达式 Exp1 ? Exp2 : Exp3;
if(pHead1->val<=pHead2->val){
      cur->next=pHead1;
      pHead1=pHead1->next;
}
else{
       cur->next=pHead2;
       pHead2=pHead2->next;
}

版本1-部分正确

class Solution {
public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
        ListNode* prePre = new ListNode(0);//指向合并后的链表
        ListNode* pre = new ListNode(0);
        prePre->next = pre;
        ListNode* cur1 = pHead1;//指向链表1头节点
        ListNode* cur2 = pHead2;//指向链表2头节点
        ListNode* nex1 = nullptr;
        ListNode* nex2 = nullptr;
         while (cur1&&cur2) 
         {
            nex1 = cur1->next;//单独取出当前节点(指的是每次把该节点与后面的链表断开,使的其变为单独节点)
            nex2 = cur2->next;
            //对比节点值大小
            if(cur1->val > cur2->val)
            {
                 pre->next = cur2;
                 cur2->next = cur1;
                 pre = cur1;
                
            }else{
                 pre->next = cur1;
                 cur1->next = cur2;
                 pre = cur2;
            }

            cur1 = nex1;//
            cur2 = nex2;
        }
        
        //cout<<cur1->val<<endl;
        //cout<<cur2->val<<endl;
        if(cur1)
        {
            pre->next = cur1;
        }else if(cur2)
        {
            pre->next = cur2;
        }
        return prePre->next->next;
        
    }
};

版本2

class Solution {
public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
        ListNode* pHead=new ListNode(-1);
        ListNode* cur=pHead;
        while(pHead1&&pHead2){
            if(pHead1->val<=pHead2->val){
                cur->next=pHead1;
                pHead1=pHead1->next;
            }
            else{
                cur->next=pHead2;
                pHead2=pHead2->next;
            }
            cur=cur->next;
        }
        
        cur->next=pHead1?pHead1:pHead2;
        
        return pHead->next;
    }
   
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值