Skip to content

Commit 5f66174

Browse files
21. Merge Two Sorted Lists
1 parent 53cda9f commit 5f66174

File tree

7 files changed

+157
-4
lines changed

7 files changed

+157
-4
lines changed
Loading
Loading
Loading
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
/**
2+
* Definition for singly-linked list.
3+
* struct ListNode {
4+
* int val;
5+
* ListNode *next;
6+
* ListNode() : val(0), next(nullptr) {}
7+
* ListNode(int x) : val(x), next(nullptr) {}
8+
* ListNode(int x, ListNode *next) : val(x), next(next) {}
9+
* };
10+
*/
11+
class Solution
12+
{
13+
public:
14+
ListNode *mergeTwoLists(ListNode *list1, ListNode *list2)
15+
{
16+
// Vérifier si l'une des listes est vide, dans ce cas, retourner l'autre liste car elle est déjà triée.
17+
if (!list2)
18+
{
19+
return list1;
20+
}
21+
if (!list1)
22+
{
23+
return list2;
24+
}
25+
26+
// Initialiser la tête de la liste fusionnée (une nouvelle liste) et un pointeur pour parcourir cette liste.
27+
ListNode *mergedListHead = new ListNode(); // Création du premier élément fictif.
28+
ListNode *currentML = mergedListHead;
29+
30+
// Parcourir les deux listes tant qu'il y a des éléments dans les deux.
31+
while (list1 && list2)
32+
{
33+
// Comparer les valeurs des noeuds actuels des deux listes et insérer le plus petit dans la liste fusionnée.
34+
if (list1->val <= list2->val)
35+
{
36+
currentML->next = list1;
37+
list1 = list1->next; // Avancer dans la liste 1.
38+
}
39+
else
40+
{
41+
currentML->next = list2;
42+
list2 = list2->next; // Avancer dans la liste 2.
43+
}
44+
currentML = currentML->next; // Avancer dans la liste fusionnée.
45+
}
46+
47+
// Une fois qu'une des listes est entièrement parcourue, il reste à attacher le reste de l'autre liste à la
48+
// liste fusionnée.
49+
if (list1)
50+
{
51+
currentML->next = list1;
52+
}
53+
else if (list2)
54+
{
55+
currentML->next = list2;
56+
}
57+
58+
// Retourner la tête de la liste fusionnée (en sautant le premier élément fictif).
59+
return mergedListHead->next;
60+
}
61+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
# 21. Merge Two Sorted Lists
2+
3+
## Énoncé
4+
5+
Vous recevez les têtes de deux listes chaînées triées `list1` et `list2`.
6+
7+
Fusionnez les deux listes en une seule liste **triée**. La liste doit être établie en réunissant les nœuds des deux premières listes.
8+
9+
Renvoie la tête de la liste chaînée fusionnée.
10+
11+
## Exemple
12+
13+
**Exemple 1:**
14+
15+
<img src="./imgs/img1.jpg"/>
16+
17+
**Input:** list1 = [1,2,4], list2 = [1,3,4]
18+
**Output:** [1,1,2,3,4,4]
19+
20+
**Exemple 2:**
21+
**Input:** list1 = [], list2 = []
22+
**Output:** []
23+
24+
**Exemple 3:**
25+
**Input:** list1 = [], list2 = [0]
26+
**Output:** [0]
27+
28+
## Contraintes
29+
30+
Le nombre de nœuds dans les deux listes est compris entre `[0, 50]`.
31+
`-100 <= Node.val <= 100`
32+
`list1` et `list2` sont triés par ordre croissant.
33+
34+
## Note personnelle
35+
36+
Ma méthode implique la création d'une nouvelle liste nommée `margedListHead` et de son pointeur d'élément courant `currentML`. Ensuite, je parcours les deux listes simultanément tant qu'elles contiennent des éléments. À chaque itération, j'effectue les actions suivantes :
37+
38+
- Je compare les valeurs de `list1` et `list2`. Si `list1->val <= list2->val`, alors je mets à jour `currentML->next` avec le pointeur `list1` et je progresse dans `list1` de 1.
39+
- Sinon, je fais la même chose avec `list2`
40+
- Ensuite, j'avance de 1 dans `currentML`.
41+
42+
À la sortie de la boucle, je vérifie si l'une des deux listes n'est pas vide pour l'ajouter à la fin de `currentML`.
43+
44+
J'ai également implémenté une approche récursive de ce problème qui suit le même principe que la version itérative. Les deux approches présentent une complexité temporelle de `O(n)` et une complexité spatiale de `O(1)`.
45+
46+
```cpp
47+
ListNode * merged = new ListNode();
48+
class Solution {
49+
public:
50+
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2, ListNode * currentMerged = merged) {
51+
// Si les deux listes sont vides
52+
if(!list1 && !list2){
53+
return nullptr;
54+
}
55+
56+
if(!list1){
57+
// Si list1 est vide, attache directement list2 à la fin du noeud fusionné
58+
currentMerged->next = list2;
59+
// Retourne le début de la liste fusionnée
60+
return merged->next;
61+
}
62+
if(!list2){
63+
// Si list2 est vide, attache directement list1 à la fin du noeud fusionné
64+
currentMerged->next = list1;
65+
// Retourne le début de la liste fusionnée
66+
return merged->next;
67+
}
68+
69+
// Si la valeur du noeud de list1 est inférieure ou égale à celle du noeud de list2
70+
if(list1->val <= list2->val){
71+
// Attache le noeud de list1 à la liste fusionnée
72+
currentMerged->next = list1;
73+
// Avance le pointeur de list1 au noeud suivant
74+
list1 = list1->next;
75+
}
76+
else{
77+
// Sinon, attache le noeud de list2 à la liste fusionnée
78+
currentMerged->next = list2;
79+
// Avance le pointeur de list2 au noeud suivant
80+
list2 = list2->next;
81+
}
82+
83+
// Appel récursif pour continuer la fusion des listes
84+
return mergeTwoLists(list1, list2, currentMerged->next);
85+
}
86+
};
87+
```
88+
89+
<img src="./imgs/runtime.png"/>
90+
<img src="./imgs/memory.png"/>

skills/linked_list.md

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ Une liste chaînée, composée de trois éléments ayant respectivement la valeu
1111

1212
| Label | Tags | Date |
1313
| ---------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ---------- |
14+
| [21. Merge Two Sorted Lists](../Probleme/0021.%20Merge%20Two%20Sorted%20Lists/) | [`Linked List`](./linked_list.md), [`Recursion`](./recursion.md) | 15-03-2024 |
1415
| [141. Linked List Cycle](../Probleme/0141.%20Linked%20List%20Cycle/) | [`Hash Table`](./hash_table.md), [`Linked List`](./linked_list.md), [`Two Pointers`](./two_pointers.md) | 06-03-2024 |
1516
| [206. Reverse Linked List](../Probleme/0206.%20Reverse%20Linked%20List/) | [`Linked List`](./linked_list.md), [`Recursion`](./recursion.md) | 09-03-2024 |
1617
| [706. Design HashMap](../Probleme/0706.%20Design%20HashMap/) | [`Array`](./array.md), [`Hash Table`](./hash_table.md), [`Linked List`](./linked_list.md), [`Design`](./design.md), `Hash Function` | 09-03-2024 |

skills/recursion.md

+5-4
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@ la **Recursion** est un concept où une fonction s'appelle elle-même pour réso
66

77
### Facile
88

9-
| Label | Tags | Date |
10-
| ------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------- | ---------- |
11-
| [206. Reverse Linked List](../Probleme/0206.%20Reverse%20Linked%20List/) | [`Linked List`](./linked_list.md), [`Recursion`](./recursion.md) | 09-03-2024 |
12-
| [509. Fibonacci Number](../Probleme/0509.%20Fibonacci%20Number/) | [`Math`](./math.md), [`Dynamic Programming`](./dp.md), [`Memoization`](./memoization.md), [`Recursion`](./recursion.md) | 08-03-2024 |
9+
| Label | Tags | Date |
10+
| ------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | ---------- |
11+
| [21. Merge Two Sorted Lists](../Probleme/0021.%20Merge%20Two%20Sorted%20Lists/) | [`Linked List`](./linked_list.md), [`Recursion`](./recursion.md) | 15-03-2024 |
12+
| [206. Reverse Linked List](../Probleme/0206.%20Reverse%20Linked%20List/) | [`Linked List`](./linked_list.md), [`Recursion`](./recursion.md) | 09-03-2024 |
13+
| [509. Fibonacci Number](../Probleme/0509.%20Fibonacci%20Number/) | [`Math`](./math.md), [`Dynamic Programming`](./dp.md), [`Memoization`](./memoization.md), [`Recursion`](./recursion.md) | 08-03-2024 |
1314

1415
### Moyen
1516

0 commit comments

Comments
 (0)