题目描述
21.合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。,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]
题解
题中要求的是新链表是通过拼接完成两个链表的合并的,因此不需要创建新的结点,只需要定义头尾指针即可,头指针用来标记新链表开头,用来做返回值;尾指针用来向后更新新链表的,每次都将l1和l2的val做比较,尾指针每次都指向较小的值,然后向后走,直到l1或l2走到NULL为止。
初始情况:
①刚开始(当newHead为NULL时),首先比较 l1->val 和 l2->val 的大小,小的值用来做新链表的头(如果相等,则l2向后走)
②当newHead不为NULL时,再次比较 l1->val 和 l2->val 的大小,使newTail->next指向较小的值,然后再更新 l1 或 l2 指针的位置(向后走一个)
③循环步骤②,直至 l1 或 l2 全部走完
④当 l1 或 l2 有一方为NULL时,将不为NULL的那一方连接到newTail的后面即可(不需要再走newTail)
题解代码
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
//新链表的头尾指针
struct ListNode* newHead = NULL;
struct ListNode* newTail = NULL;
if(l1 == NULL){
return l2;
}
if(l2 == NULL)
{
return l1;
}
//确定第一个结点,头尾指针
if(l1->val < l2->val)
{
newHead = newTail = l1;
l1 = l1->next;
}else
{
newHead = newTail = l2;
l2 = l2->next;
}
while(l1 && l2)
{
if(l1->val < l2->val)
{
newTail->next = l1;
newTail = l1;
l1 = l1->next;
}
else{
newTail->next = l2;
newTail = l2;
l2 = l2->next;
}
}
if(l1){
newTail->next = l1;
}
if(l2)
{
newTail->next = l2;
}
return newHead;
}