给定两个以 有序链表 形式记录的训练计划 l1
、l2
,分别记录了两套核心肌群训练项目编号,请合并这两个训练计划,按训练项目编号 升序 记录于链表并返回。
注意:新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
示例 2:
输入:l1 = [], l2 = []
输出:[]
示例 3:
输入:l1 = [], l2 = [0]
输出:[0]
提示:
0 <= 链表长度 <= 1000
思路:
1、先定义一个头结点res用来返回,用r指向它。
2、采用尾插法,定义两个指针遍历两个链表,将小的结点添加到r的next。
3、最后将遍历完还不为空的链表添加到尾部。
4、返回res的下一个结点。
代码实现:
/**
* 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* trainningPlan(ListNode* l1, ListNode* l2) {
if(l1 == nullptr)
return l2;
if(l2 == nullptr)
return l1;
ListNode *p = l1, *q = l2;
ListNode *res = new ListNode;
ListNode *r = res;
while(p && q)
{
if(p->val <= q->val)
{
r->next = p;
r = p;
p = p->next;
}
else
{
r->next = q;
r = q;
q = q->next;
}
}
r->next = p == nullptr ? q : p;
return res->next;
}
};