/**
 * struct ListNode {
 *    int val;
 *    struct ListNode *next;
 * };
 */

class Solution {
public:
    /**
     * 
     * @param l1 ListNode类 
     * @param l2 ListNode类 
     * @return ListNode类
     */
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        // write code here
        if (l1 == nullptr)
            return l2;
        if (l2 == nullptr)
            return l1;

        ListNode* l = nullptr; // 创建链表(头结点)
        ListNode** pNode = &l; // 给头结点一个指针

        // l1和l2两个链表都没到空的过程不断给新链表通过比较赋值
        while (l1 != nullptr && l2 != nullptr)
        {
            if (l1->val <= l2->val)
            {
                *pNode = new ListNode(l1->val); // 解引用的方式赋值
                l1 = l1->next;
            }
            else
            {
                *pNode = new ListNode(l2->val);
                l2 = l2->next;
            }

            pNode = &((*pNode)->next); // 指针往链表的下一个元素移动

        }

        // 谁为空,另一个就接着上
        if (l1 == nullptr)
        {
            while (l2 != nullptr)
            {
                *pNode = new ListNode(l2->val);
                l2 = l2->next;
                pNode = &((*pNode)->next);
            }
        }
        else
        {
            while(l1 != nullptr)
            {
                *pNode = new ListNode(l1->val);
                l1 = l1->next;
                pNode = &((*pNode)->next);
            }
        }
        return l; // 返回新链表的头结点
    }
};