将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 链表为无头结点、单向、不循环。(由于涉及到结构体,所以写不了完整的测试代码,下面展示的代码为LeetCode中写的代码)

//第一次尝试:
//方法一:双指针法/迭代法,先创建一个虚头结点list,设置两个指针,分别指向l1、l2,比较l1和l2的大小,然后将小的以尾插法插入list中,然后更新小的指针到下一个
// 最终肯定会有一个先走到NULL,所以只需将剩下的非空的链表的剩余结点直接链到list的尾部;
//方法二:递归法,首先要确定递归的结束条件,那就是至少有一个链表走到NULL;知道结束条件之后就开始递归,先比l1和l2的大小,将小的向下更新一个
// 然后在进行下一次递归时,要先保留当前的节点,再进行递归;
//
递归的函数 struct ListNode* function(struct ListNode* l1,struct ListNode* l2){
//递归结束条件
if(l1 == NULL){ return l2; } if(l2 == NULL){ return l1; } struct ListNode* node = NULL; if(l1->val < l2->val){
//进行l1和l2的比较之后,先保留当前的节点再更新到下一个 node
= l1; l1 = l1->next; } else{
//同上 node
= l2; l2 = l2->next; } struct ListNode* ret = function(l1, l2);、
//头插法插入先前保留的结点 node
->next = ret; return node; } struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){ if(l1 == NULL){ return l2; } if(l2 == NULL){ return l1; } //递归法 struct ListNode* ret = function(l1, l2); return ret; //双指针法
//设置虚头结点 struct ListNode list; list.next = NULL;
//设置更新变量结点
struct ListNode* node = &list; while(l1 != NULL&&l2 != NULL){ if(l1->val < l2->val){ node->next = l1; l1 = l1->next; } else{ node->next = l2; l2 = l2->next; } node = node->next; }
//最后会有一个先空,只需将另一个非空的接到最后面即可 node
->next = l1 == NULL ? l2 : l1; return list.next; }