題目描述
最簡單粗暴的想法是將兩個連結串列的所有元素拿出來放在一個陣列中,再將此陣列排序,最後生成一個新連結串列並返回。由於給出的引數本身就是兩個排好序的連結串列,可以進行一次遍歷,就能保證元素仍然是有序的:每次比較當前指標指向的兩個元素的大小,較小的拿出來作為當前元素並將指標向前移動一個位置,然後繼續比較下一個元素。對於記憶體的使用也可以最佳化,可以直接複用當前連結串列的結點,僅僅調整結點之間指標的指向即可。
// C++
class Solution {
public:
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
if (list1 == nullptr) {
return list2;
}
if (list2 == nullptr) {
return list1;
}
ListNode* head = new ListNode();
ListNode* p = head;
ListNode *p1 = list1, *p2 = list2;
while (p1 != nullptr && p2 != nullptr) {
if (p1->val < p2->val) {
p->next = p1;
p1 = p1->next;
p = p->next;
} else {
p->next = p2;
p2 = p2->next;
p = p->next;
}
}
if (p1 != nullptr) {
p->next = p1;
}
if (p2 != nullptr) {
p->next = p2;
}
return head->next;
}
};