题目链接:
题目:
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4]
示例 2:
输入:l1 = [], l2 = [] 输出:[]
示例 3:
输入:l1 = [], l2 = [0] 输出:[0]
提示:
- 两个链表的节点数目范围是
[0, 50]
-100 <= Node.val <= 100
l1
和l2
均按 非递减顺序 排列
理解分享:
-
首先检查两个输入的链表是否为空。如果其中一个为空,就返回另一个链表,因为合并后的链表就是非空链表本身。
-
然后定义了四个指针
n1
、n2
、head
和tail
。n1
和n2
分别代表两个输入链表的当前节点,head
和tail
分别表示合并后链表的头节点和尾节点,初始时都为NULL
。 -
进入一个循环,条件是
n1
和n2
都不为空。在循环中,比较n1
和n2
当前节点的值,将值较小的节点接到合并后的链表中。如果n1
的值小于等于n2
的值,就将n1
加入合并后的链表中,反之将n2
加入。加入操作分为两种情况:如果合并后的链表为空,则将头节点和尾节点都设为当前节点;如果不为空,则将当前节点接到尾节点后,并更新尾节点为当前节点。 -
当循环结束后,可能存在其中一个链表还有剩余节点未加入合并链表中。因此,再次检查
n1
和n2
是否还有剩余节点,如果有,则将剩余节点接到合并链表的尾部。 -
最后返回合并后的链表的头节点
head。
代码:
typedef struct ListNode ll;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
if (list1 == NULL)
{
return list2;
}
if (list2 == NULL)
{
return list1;
}
ll* n1 = list1;
ll* n2 = list2;
ll* head, * tail;
head = tail = NULL;
while (n1 && n2)
{
if (n1->val > n2->val)
{
if (head == NULL)
{
head = tail = n2;
}
else
{
tail->next = n2;
tail = tail->next;
}
n2 = n2->next;
}
else
{
if (head == NULL)
{
head = tail = n1;
}
else
{
tail->next = n1;
tail = tail->next;
}
n1 = n1->next;
}
}
if (n1)
{
tail->next = n1;
}
if(n2)
{
tail->next = n2;
}
return head;
}