题目链接:https://leetcode-cn.com/problems/merge-two-sorted-lists/
题目说明:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
题目示例:示例 1:
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
示例 2:
输入:l1 = [], l2 = []
输出:[]
示例 3:
输入:l1 = [], l2 = [0]
输出:[0]
题目思路:
如上,力扣平台已经给出了函数方法,可以使用递归的思想与非递归的思想进行解决
非递归思想:
1、创建虚拟头结点与指向头结点的指针
2、进行判断链表是否为空,l1 为空怎么解决,l2为空怎么解决,l1、l2都不为空怎么解决
3、l1 l2 都不为空时 需要对链表里的变量进行判断,若l1.val < l2.val 需要将p指针指向l1、l1指针指向下一个变量
代码:
class Solution { public: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { //非递归做法 ListNode * head = new ListNode(0);//链表都有虚拟的头结点,定义虚拟的头结点 ListNode *p = head;//定义一个listnode类型的指针,并指向头结点 //1、首先判断两个链表是否为空,都不为空时 while(l1 && l2 ){ //2、判断l1 与 l2 的值 l1 l2 为两个指针,从0开始索引 if(l2->val > l1->val) { p->next = l1; l1=l1->next; } else { p->next = l2; l2=l2->next; } //存入数值后,将值往后移动一位 p=p->next; } //当有L1或者L2为空时,直接将另一个链表中剩下的数存入p的尾部 if(l1 !=nullptr) { p->next=l1; } if(l2 !=nullptr){ p->next=l2; } return head->next; } };
递归代码:
public ListNode mergeTwoLists(ListNode l1, ListNode l2){ if(l1 == null){ return l2; } if(l2 == null){ return l1; } if(l1->val < l2->val){ l1->next = mergeTwoLists(l1->next,l2); return l1; }else{ l2->next = mergeTwoLists(l1,l2->next); return l2; } } }