目录
题目描述
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 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
均按 非递减顺序 排列
题目分析
该题目是让我们按升序排列两个有序链表。
题目思路
我们可以先弄一个新链表。定义一个头指针和尾指针。头指针是新链表的的头指针,尾指针是给新链表尾插用的。比较两个链表相对应的结点大小,小的结点直接尾插到新链表上。
两种情况
两个链表都不为空时
对链表的结点一个一个的进行比较,取较小的进行尾插,大的不动,留在原位继续比较。直到一个链表为空时停止比较。把剩余链表的结点直接尾插到新链表中。最后返回新链表的头结点
两个链表都为空或只有一个为空时
当有一个链表是空链表的时候,直接返回另一个链表。
代码演示:
struct ListNode
{
int val;
struct ListNode* next;
};
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{
struct ListNode* head = NULL, * tail = NULL;
//当链表1为空的时候,直接返回链表2
if (list1 == NULL)
return list2;
//当链表2为空的时候,直接返回链表1
if (list2 == NULL)
return list1;
//当两个链表有一个遍历完了,便结束循环
while (list1 && list2)
{
//取小的节点尾插到新链表的后面
if (list1->val < list2->val)
{
if (head == NULL)//给头结点和尾结点赋值。循环刚开始,也就是头结点,尾结点都为空的时候
{
head = tail = list1;
}
else
{
tail->next = list1;
tail = tail->next;
}
list1 = list1->next;//向后走一步
}
else
{
if (head == NULL)//给头结点和尾结点赋值。循环刚开始,也就是头结点,尾结点都为空的时候
{
head = tail = list2;
}
else
{
tail->next = list2;
tail = tail->next;
}
list2 = list2->next;//向后走一步
}
}
//当循环结束是,还没遍历完的剩余部分直接尾插到新链表的后面
if (list1)
{
tail->next = list1;
}
if (list2)
{
tail = list2;
}
return head;//返回头结点
}