21.合并两个有序链表 c++

21.合并两个有序链表

写在前面,小白从零刷题,在解答会写出思路,正确答案,以及所有使用到的语法和知识点

1. 迭代

  1. 思路就是定义一个哨兵节点,然后判断l1和l2哪个小,指向小的,然后小的后移一位,

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        ListNode* preHead = new ListNode(-1);//定义一个新的节点,prehead指向它,此处保留方便之后用
        ListNode* prev = preHead;//定义一个指针指向它
        while (l1 != nullptr && l2 != nullptr) {//如果不空
            if (l1->val < l2->val) {
                prev->next = l1;
                l1 = l1->next;//连起来指向下一个节点
            } else {
                prev->next = l2;
                l2 = l2->next;//
            }
            prev = prev->next;
        }
        // 合并后 l1 和 l2 最多只有一个还未被合并完,我们直接将链表末尾指向未合并完的链表即可
        prev->next = l1 == nullptr ? l2 : l1;

        return preHead->next;//方便返回定义一个头节点
    }
};

2.不看答案写一次

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {

        ListNode* dummy= new ListNode(0);
        ListNode* cur=dummy;
        while(l1!=nullptr&&l2!=nullptr)
        {
            if(l1->val<l2->val)
            {
                cur->next=l1;
                l1=l1->next;
            }
            else
            {
                cur->next=l2;
                l2=l2->next;
            }
            cur=cur->next;
        }   
        cur->next=l1==nullptr? l2:l1;//学习一下
        return dummy->next;//返回
    }
};

知识点

  1. C++11nullptr关键字

你可能感兴趣的:(剑指offer,链表,指针,c++,java,leetcode)