日常刷题中!🐵
题目😎
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例1😆
输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4]示例2😊
输入:l1 = [], l2 = [] 输出:[]示例3😯
输入:l1 = [], l2 = [0] 输出:[0]
LeetCode链接😉
题目分析😊
链表的创建要能找到头结点和尾结点,所以这里先创建一个头结点head和尾结点tail,然后同时去遍历list1链表,和list2链表。因为链表本身就是有序的,所以找两链表中小数据结点往后链接。这里分两种情况,如果是第一次链接,则头结点和尾结点都指向空,然后让头结点和尾结点都指向这个结点,最后我们只需要返回头结点即可。如果已经链接了结点,则只需要往尾结点后进行链接,最后也是返回头节点即可。
边界分析,如果list1先遍历完则只需将list2链接到tail尾结点后面,如果list2先遍历完,则只需将list1链接到tail尾结点后界即可。如果ilist1为空链表,则直接返回list2链表。如果list2为空链表,则直接返回list1链表,这样就可以保证最后链接的整个链表都是有序的。
代码实现🤨
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{
if (list1 == NULL)
{
return list2;
}
if (list2 == NULL)
{
return list1;
}
struct ListNode* head = NULL;
struct ListNode* tail = NULL;
while (list1 && list2)//同时遍历两链表
{
if (list1->val < list2->val)
{
if (tail == NULL)//第一次链接
{
head = list1;
tail = list1;
list1 = list1->next;
}
else//已经有结点之后的链接
{
tail->next = list1;
tail = tail->next;
list1 = list1->next;
}
}
else
{
if (tail == NULL)
{
head = list2;
tail = list2;
list2 = list2->next;
}
else
{
tail->next = list2;
tail = tail->next;
list2 = list2->next;
}
}
}
if (list1 == NULL)//list1先遍历完
{
tail->next = list2;
}
if (list2 == NULL)//list2先遍历完
{
tail->next = list1;
}
return head;
}
小结🐵
链表的实现就是要把握好两结点之间的链接,还有一定要记录头结点,这里用的思想其实就是归并的思想,所以需要我们加深对各种算法思想的理解。