在一个链表上操作

/**
 * 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&&!l2)return nullptr;
//         if(!l1)return l2;
//         if(!l2)return l1;
         if(l1==nullptr||l2==nullptr) return  l1?l1:l2;//看到别人的更简洁些哈哈
        ListNode* q=nullptr;
        ListNode* p1=l1;
        ListNode* p2=l2;
        if(p1->val<=p2->val)//把最小的头结点赋值给q;
        {
            q=p1;
            p1=p1->next;//后移
        }
        else
        {
            q=p2;
            p2=p2->next;
        }
        ListNode *qq=q;//记录头结点
        while(p2&&p1)
        {
            if(p1->val<=p2->val)
            {
                q->next=p1;
                q=p1;//更新位置
                p1=p1->next;
            }
            else//大于
            {
                q->next=p2;
                q=p2;
                p2=p2->next;

            }
        }
        if(p1)//剩余的直接连接在后面
            q->next=p1;
        if(p2)
            q->next=p2;
        return qq;
    }
};