合并两个排序的链表

题目描述

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

解题思路

示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

  1. 创建一个新链表,循环比较两个原链表的值,每次将较小的值插入到新链表中,最后再将某个链表中剩余的部分整个插入到新链表中,这个方法好想,但是实现起来稍微有点复杂,这里就不贴代码了,我主要解释下第二种我认为更为简单的做法
  2. 将L1作为返回的新链表,与L2中的元素挨个比较,如果比L2中的大,则将L2的元素插到L1的前面,L2向后走;如果比L2中的小,则L1往后遍历,直到比L2的大,将L2的元素插到L1的前面,如果L1遍历到末尾而L2还有剩余,则此时L1中的元素肯定都小于L2中的元素,把L2的剩余部分整个拼接过来;如果L2到了末尾,则两个链表已经合并完成
  3. 只是一个解题思路,不过这方法写起来简单,但是复杂度高,就是先遍历一个链表找到尾节点,然后将另一个链表整体插入过来,变成一个新的链表,再进行排序。

第二个方法的注意点:L1往后遍历时,要记得用一个指针保存当前节点的前一个节点,为了能往当前节点插入到L1指向节点的前面

代码演示

/*
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 == NULL) return pHead2;
        else if(pHead2 == NULL) return pHead1;
        ListNode* cur1 = pHead1;//cur1遍历L1
        ListNode* cur2 = pHead2;//cur2遍历L2
        ListNode* next = NULL;//用来保存L2遍历结果的下一节点,插入后cur2要能指回来
        ListNode* prev = cur1;
        while(cur1 != NULL && cur2 != NULL)
        {
            if(cur1->val <= cur2->val)
            {
                prev = cur1;//保存cur1的前一节点,为了能在cur1前插入新节点
                cur1 = cur1->next;//cur1往后遍历
                continue;
            }
            //往cur1前插入节点
            next = cur2->next;
            prev->next = cur2;
            cur2->next = cur1;
            cur2 = next;
        }
        //cur1遍历到L1的末尾,此时prev正指向L1的最后一个节点,将L2剩余部分整个拼接过来
        prev->next = cur2;
        return pHead1;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值