zoukankan      html  css  js  c++  java
  • 面试题25:合并两个排序的链表(C++)

    题目地址:https://leetcode-cn.com/problems/he-bing-liang-ge-pai-xu-de-lian-biao-lcof/

    题目描述

    输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。

    题目示例

    示例1:

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

    解题思路

    双指针(迭代):我们将链表l1和l2合并后生成的新链表头节点设置为哑节点p,然后将l1和l2的节点比较大小,按照从小到大的顺序依次添加到哑节点p之后,如果l1的值val小于等于l2的val值,则将l1的val值追加到p之后,否则将l2的val值追加到p之和,从而构成新链表,最后合并链表尾部,如果链表l1不为空,则p继续指向l1,否则p指向链表l2剩余部分。因为合并后的链表的第一个节点是在p之和,所以返回q->next。

    递归:递归调用函数,按照单调递增顺序依次返回。

    程序源码

    方法1:双指针/迭代

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
            ListNode* p = new ListNode(-1);
            ListNode* q = p;
            if(l1 == nullptr) return l2;
            if(l2 == nullptr) return l1;
            while(l1 !=nullptr && l2 != nullptr)
            {
                if(l1->val <= l2->val)
                {
                    p->next = l1;
                    l1 = l1->next;
                }
                else
                {
                    p->next = l2;
                    l2 = l2->next;
                }
                p = p->next;
            }
           if(l1 != nullptr)
           {
               p->next = l1;
           }
           if(l2 != nullptr)
           {
               p->next = l2;
           }
           return q->next;
        }
    };

    方法2:递归

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
            if(l1 == nullptr) return l2;
            if(l2 == nullptr) return l1; 
            ListNode* p;
            if(l1->val < l2->val)
            {
                p = l1;
                p->next = mergeTwoLists(l1->next, l2);
            }
            else
            {
                p = l2;
                p->next = mergeTwoLists(l1, l2->next);
            }
            return p;
        }
    };
    ----------------------------------- 心之所向,素履所往;生如逆旅,一苇以航。 ------------------------------------------
  • 相关阅读:
    element ui 表单清空
    element ui 覆盖样式 方法
    element ui 修改表单值 提交无效
    element ui 抽屉里的表单输入框无法修改值
    element ui 抽屉首次显示 闪烁
    css 左侧高度 跟随右侧内容高度 自适应
    PICNUF框架
    elementui 抽屉组件标题 出现黑色边框
    vue 子组件跨多层调用父组件中方法
    vue 编辑table 数据 未点击提交,table里的数据就发生了改变(深拷贝处理)
  • 原文地址:https://www.cnblogs.com/wzw0625/p/12553549.html
Copyright © 2011-2022 走看看