https://leetcode-cn.com/problems/merge-two-sorted-lists/

struct ListNode【singly-linked list】
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
图2-5 单链表结构

alt

单链表的结点结构
typeded struct node{//结构名为node
  T Element;//元素域Element 用户自定义的元素类型T
  struct node* Link;//指针域Link
}Node;//单链表的结点类型Node
21. 合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 

alt alt

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
        
    }
};
递归
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
      //如果 l1 或者 l2 一开始就是空链表 ,那么没有任何操作需要合并,所以我们只需要返回非空链表。如果两个链表有一个为空,递归结束。
        if (l1 == nullptr) {
            return l2;
        } else if (l2 == nullptr) {
            return l1;
        } else if (l1->val < l2->val) {//否则,我们要判断 l1 和 l2 哪一个链表的头节点的值更小,
            l1->next = mergeTwoLists(l1->next, l2);//然后递归地决定下一个添加到结果里的节点。
            return l1;
        } else {
            l2->next = mergeTwoLists(l1, l2->next);
            return l2;
        }
    }
};
迭代
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        ListNode* preHead = new ListNode(-1);//首先,我们设定一个哨兵节点 prehead ,这可以在最后让我们比较容易地返回合并后的链表。

        ListNode* prev = preHead;//我们维护一个 prev 指针,我们需要做的是调整它的 next 指针。
        while (l1 != nullptr && l2 != nullptr) {//然后,我们重复以下过程,直到 l1 或者 l2 指向了 null :
            if (l1->val < l2->val) {//如果 l1 当前节点的值小于等于 l2 ,
              //我们就把 l1 当前的节点接在 prev 节点的后面同时将 l1 指针往后移一位。
                prev->next = l1;
                l1 = l1->next;
            } else {//否则,我们对 l2 做同样的操作。
                prev->next = l2;
                l2 = l2->next;
            }
            prev = prev->next;//不管我们将哪一个元素接在了后面,我们都需要把 prev 向后移一位。
        }

        // 合并后 l1 和 l2 最多只有一个还未被合并完,我们直接将链表末尾指向未合并完的链表即可
        prev->next = l1 == nullptr ? l2 : l1;//在循环终止的时候, l1 和 l2 至多有一个是非空的。由于输入的两个链表都是有序的,所以不管哪个链表是非空的,它包含的所有元素都比前面已经合并链表中的所有元素都要大。这意味着我们只需要简单地将非空链表接在合并链表的后面,并返回合并链表即可。

      
    }
};