此道题目,我的解法还是略显复杂,原因是当一个链表指针为空,而另外一个链表还有元素时,为了串联余下的元素,我又遍历了一遍尚有元素的链表。这样就操作复杂了。我的解法如下:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if (!l1 && !l2) {
return NULL;
}
ListNode* result = NULL, *tmp = NULL, *first = l1, *second = l2;
bool ifFirst = true;
while (first != NULL && second != NULL) {
if (ifFirst) {
if (first->val <= second->val) {
result = first;
first = first->next;
} else {
result = second;
second = second->next;
}
tmp = result;
ifFirst = false;
} else {
if (first->val <= second->val) {
tmp->next = first;
first = first->next;
} else {
tmp->next = second;
second = second->next;
}
tmp = tmp->next;
}
}
if (ifFirst && l2 != NULL) {
return l2;
} else if (ifFirst && l1 != NULL) {
return l1;
}
while (first != NULL) {
tmp->next = first;
tmp = tmp->next;
first = first->next;
}
while (second != NULL) {
tmp->next = second;
tmp = tmp->next;
second = second->next;
}
tmp->next = NULL;
return result;
}
更简洁、高效的解法包含两个trick。第一,是定义一个fake head。这样以后的一些操作就会大大简便。第二,如果后面p1 != NULL,直接p->next = p1。代码如下:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode* head = new ListNode(0); <span style="color:#ff0000;">// fake head
</span> ListNode *p = head, *p1 = l1, *p2 = l2;
while (p1 != NULL && p2 != NULL) {
if (p1->val <= p2->val) {
p->next = p1;
p1 = p1->next;
} else {
p->next = p2;
p2 = p2->next;
}
p = p->next;
}
if (p1 != NULL) {
p->next = p1;
}
if (p2 != NULL) {
p->next = p2;
}
return head->next;
}