1.暴力解法
我们可以用迭代的方法来实现。我们开辟一个新节点dummy。当 list1 和 list2 都不是空链表时,判断 list1 和 list2 哪一个链表的头节点的值更小,将较小值的节点添加到dummy里,当一个节点被添加到dummy里之后,将对应链表中的节点向后移一位。
首先,我们设定一个节点 dummy。我们把dummy拷贝给一个 pre指针,我们需要做的是调整它的 next 指针。然后,我们重复以下过程,直到 list1 或者 list2 指向了 NULL :如果 list1 当前节点的值小于等于 list2 ,我们就把 list1 当前的节点接在 pre 节点的后面同时将 list1 指针往后移一位。否则,我们对 list2 做同样的操作。不管我们将哪一个元素接在了后面,我们都需要把 prev向后移一位。
在循环终止的时候, list1 和 list2 只有一个是非空的。由于输入的两个链表都是有序的,所以不管哪个链表是非空的,它包含的所有元素都比前面已经合并链表中的所有元素都要大。这意味着我们只需要简单地将非空链表接在合并链表的后面,并返回合并链表即可。
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{
struct ListNode* dummy = (struct ListNode*)malloc(sizeof(struct ListNode));
if (dummy == NULL)
{
perror("malloc fail");
return NULL;
}
struct ListNode* pre = dummy;
while(list1 != NULL && list2 != NULL )
{
if(list1->val >= list2->val)
{
pre->next = list2;
pre = pre->next;
list2 = list2->next;
}
else
{
pre->next = list1;
pre = pre->next;
list1 = list1->next;
}
}
pre->next = list1 == NULL ? list2 : list1;
return dummy->next;
}
2.递归(我一看就懂,一写就费的解法)
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{
if(list1==NULL)
return list2;
if(list2==NULL)
return list1;
if(list1->val < list2->val)
{
list1->next = mergeTwoLists(list1->next,list2);
return list1;
}
else
{
list2->next = mergeTwoLists(list1,list2->next);
return list2;
}
}