将两个升序的链表合并成一个升序的链表并要求不改变原来的相对位置。可以用带哨兵位的头节点来做,就是通过创建一个结点,结点的next置空,将两个链表较小值放入头节点。这样就避免了判断头指针的问题。
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
if(!(list1))return list2;
if(!(list2))return list1;
struct ListNode* L1 = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* prev;
L1->next = NULL;
prev = L1;
while(list1 || list2)
{
if(list1 == NULL)
{
prev->next = list2;
return L1->next;
}
if(list2 == NULL)
{
prev->next = list1;
return L1->next;
}
if(list2 == NULL || list1->val < list2->val)
{
prev->next = list1;
prev = list1;
list1 = list1->next;
}
else
{
prev->next = list2;
prev = list2;
list2 = list2->next;
}
}
return L1->next;
}
也可以通过直接链接两个链表,要判断头指针会麻烦很多。
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
if (!list1)return list2;
if (!list2)return list1;
struct ListNode* newhead;
struct ListNode* prev;
if (list1->val < list2->val)
{
newhead = list1;
prev = list1;
if (list1->next)list1 = list1->next;
}
else
{
newhead = list2;
prev = list2;
if (list2->next)list2 = list2->next;
}
if (prev == list1 && prev->next == NULL)
{
prev->next = list2;
}
else if(prev == list2 && prev->next == NULL)
{
prev->next = list1;
}
else
{
while (prev->next)
{
if (list1->val < list2->val)
{
prev->next = list1;//链接两个链表
prev = list1;
if (list1->next)
{
list1 = list1->next;//下一个不为空指向下一个
}
else
{
prev->next = list2;
return newhead;
}
}
else
{
prev->next = list2;
prev = list2;
if (list2->next)
{
list2 = list2->next;
}
else
{
prev->next = list1;
return newhead;
}
}
}
}
return newhead;
}