题目描述:21. 合并两个有序链表 - 力扣(LeetCode)
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
题解思路:
- 创建一个新的链表,并将头节点设置为 newHead,用两个指针current1、current2分别指向链表的头节点;(这里便于尾插,可以用一个尾指针指向新链表末尾和创建一个带哨兵位头结点的链表,返回值为newHead->next)
- 比较current1、current2指向节点数值大小:如果current1的数值大于current2,则将current2作为新节点尾插在newHead后面,current2向后移动;如果current1的数值小于或等于current2,则将current1作为新节点尾插在newHead后面,current1向后移动;
- 重复步骤二,直到current1、current2有一个指向NULL;如果current1指向NULL(current2没有指向NULL),就把current2剩余节点全部尾插到新链表后面;如果current2指向NULL(current1没有指向NULL),就把current1剩余节点全部尾插到新链表后面;
- 返回新链表的头节点newHead。
代码:
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{
struct ListNode* newHead = (struct ListNode*)malloc(sizeof(struct ListNode));
newHead->next = NULL;
struct ListNode* tail = newHead;
struct ListNode* current1 = list1, *current2 = list2;
while(current1 && current2)
{
// 比较
if(current1->val > current2->val)
{
// 尾插
struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
newNode->val = current2->val;
newNode->next = NULL;
tail->next = newNode;
tail = newNode;
current2 = current2->next;
}
else
{
struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
newNode->val = current1->val;
newNode->next = NULL;
tail->next = newNode;
tail = newNode;
current1 = current1->next;
}
}
if(current1) //current1 有剩余节点
{
tail->next = current1;
}
if(current2) //current2 有剩余节点
{
tail->next = current2;
}
return newHead->next;
}
注:这里尾插的的时候可以不进行创建新的节点,可以直接用原链表的节点进行连接即可。
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{
if (list1 == NULL)
return list2;
if (list2 == NULL)
return list1;
struct ListNode* head = NULL, * tail = NULL;
head = tail = (struct ListNode*)malloc(sizeof(struct ListNode));
while (list1 && list2)
{
if (list1->val > list2->val)
{
tail->next = list2;
tail = tail->next;
list2 = list2->next;
}
else
{
tail->next = list1;
tail = tail->next;
list1 = list1->next;
}
}
if(list1 != NULL)
{
tail->next = list1;
}
if(list2 != NULL)
{
tail->next = list2;
}
return head->next;
}
显然这种方法更好,但其思路是一模一样的。
本次内容到此结束了!如果你觉得这篇博客对你有帮助的话 ,希望你能够给我点个赞,鼓励一下我。感谢感谢……