1、指针移动
我们比较两个链表的第一位谁更小,以更小的值为val新建一个链表节点并接入到原先的链表中,最后返回链表即可。其中需要考虑两种特殊情况,一种是两个链表均为空,另一种是一个链表为空,另一个不为空。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
ListNode *dummyHead = new ListNode();
ListNode *result;
int times = 0;
if (list1 == NULL && list2 == NULL) {
return NULL;
} else if (list1 == NULL || list2 == NULL) {
return list1 == NULL ? list2 : list1;
} else {
while (list1 != NULL && list2 != NULL) {
if (list1->val <= list2->val) {
dummyHead->next = new ListNode(list1->val);
dummyHead = dummyHead->next;
list1 = list1->next;
} else {
dummyHead->next = new ListNode(list2->val);
dummyHead = dummyHead->next;
list2 = list2->next;
}
if (++times == 1) {
result = dummyHead;
}
}
if (list1 != NULL) {
while (list1 != NULL){
dummyHead->next = new ListNode(list1->val);
dummyHead = dummyHead->next;
list1 = list1->next;
}
} else if (list2 != NULL) {
while (list2 != NULL){
dummyHead->next = new ListNode(list2->val);
dummyHead = dummyHead->next;
list2 = list2->next;
}
}
return result;
}
}
};
2、优化
使用指向指针的指针pp来记录l1或l2指针本身,这样子cur->next记录的就会是指针本身,这样子我们继续移动指针进行比较即可。当最终有一个链表不为空时,则将整个链表接到结果上。
值得注意的是,这里使用*pp进行移动,避免了对到底移动l1还是l2进行讨论,从而进一步优化了代码。
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode* dummy = new ListNode(0);
ListNode* cur = dummy;
while (l1 != nullptr && l2 != nullptr) {
ListNode** pp = (l1->val < l2->val) ? &l1 : &l2;
cur->next = *pp;
cur = cur->next;
*pp = (*pp)->next;
}
cur->next = (l1 == nullptr) ? l2 : l1;
ListNode* ans = dummy->next;
delete dummy;
return ans;
}