Merge Two Sorted Linked Lists in DSA C# - Time & Space Complexity
We want to understand how the time needed to merge two sorted linked lists changes as the lists get bigger.
Specifically, how does the work grow when the input lists grow?
Analyze the time complexity of the following code snippet.
public ListNode MergeTwoLists(ListNode l1, ListNode l2) {
if (l1 == null) return l2;
if (l2 == null) return l1;
if (l1.val < l2.val) {
l1.next = MergeTwoLists(l1.next, l2);
return l1;
} else {
l2.next = MergeTwoLists(l1, l2.next);
return l2;
}
}
This code merges two sorted linked lists by comparing their nodes one by one and linking them in order.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Comparing nodes and moving to the next node in either list.
- How many times: Each node from both lists is visited exactly once during the merge.
As the total number of nodes in both lists grows, the number of comparisons and linkings grows roughly the same.
| Input Size (n = total nodes) | Approx. Operations |
|---|---|
| 10 | About 10 comparisons and linkings |
| 100 | About 100 comparisons and linkings |
| 1000 | About 1000 comparisons and linkings |
Pattern observation: The work grows linearly with the total number of nodes.
Time Complexity: O(n + m)
This means the time to merge grows directly with the total number of nodes in both lists combined.
[X] Wrong: "The merge takes quadratic time because of the recursion."
[OK] Correct: Each node is visited only once, so the recursion depth matches the total nodes, not their square.
Understanding this merge process and its time cost helps you handle linked list problems confidently in interviews.
"What if the input lists were arrays instead of linked lists? How would the time complexity change?"
Practice
Solution
Step 1: Understand the problem goal
The goal is to combine two sorted linked lists into one sorted linked list.Step 2: Clarify the expected output
The output should be a single linked list that maintains sorted order and contains all nodes from both input lists.Final Answer:
Create a new sorted linked list containing all elements from both lists -> Option BQuick Check:
Merge means combine sorted lists into one sorted list [OK]
- Thinking merge means reversing lists
- Trying to sort lists separately without merging
- Removing duplicates instead of merging
Solution
Step 1: Check class declaration and access modifiers
public class Node { public int val; public Node next; public Node(int x) { val = x; next = null; } } correctly declares a public class with public fields and a constructor initializing values.Step 2: Verify field types and initialization
public class Node { public int val; public Node next; public Node(int x) { val = x; next = null; } } uses 'int val' and 'Node next' with proper initialization; others miss public or use wrong types.Final Answer:
public class Node { public int val; public Node next; public Node(int x) { val = x; next = null; } } -> Option CQuick Check:
Correct class with public fields and constructor [OK]
- Missing public keyword causing access errors
- Using struct instead of class for linked list node
- Incorrect type for next pointer
List1: 1 -> 3 -> 5 -> null
List2: 2 -> 4 -> 6 -> null
Assuming the merge function merges correctly.
Solution
Step 1: Compare first nodes of both lists
1 (List1) < 2 (List2), so 1 is first in merged list.Step 2: Continue comparing nodes in order
Next compare 3 and 2, 2 is smaller, then 3 and 4, 3 is smaller, then 5 and 4, 4 is smaller, then 5 and 6, 5 is smaller, finally 6.Final Answer:
1 -> 2 -> 3 -> 4 -> 5 -> 6 -> null -> Option AQuick Check:
Merge sorted lists by picking smaller node each step [OK]
- Appending one list entirely before the other
- Not maintaining sorted order
- Mixing node order incorrectly
public Node Merge(Node l1, Node l2) {
if (l1 == null) return l2;
if (l2 == null) return l1;
if (l1.val < l2.val) {
l1.next = Merge(l1.next, l2);
return l1;
} else {
l2.next = Merge(l1, l2.next);
return l2;
}
}Solution
Step 1: Analyze base cases
Code returns the other list if one is null, correctly handling empty lists.Step 2: Check recursive merge logic
Code compares values and recursively merges the rest, correctly linking nodes in sorted order.Final Answer:
No error; the code correctly merges two sorted linked lists -> Option AQuick Check:
Recursive merge with base cases and correct comparisons [OK]
- Forgetting to return merged list
- Incorrect base case handling
- Wrong comparison operator
List1: 1 -> 4 -> 5 -> null
List2: 1 -> 3 -> 4 -> null
After merging, what is the correct merged list?
Also, explain why duplicates appear and how the merge handles them.
Solution
Step 1: Merge nodes in sorted order including duplicates
Both lists have '1' and '4' values; merge keeps all nodes, so duplicates appear in order.Step 2: Explain duplicate handling
Merge does not remove duplicates; it links nodes as they appear, preserving duplicates in sorted order.Final Answer:
1 -> 1 -> 3 -> 4 -> 4 -> 5 -> null -> Option DQuick Check:
Duplicates kept; merge preserves all nodes sorted [OK]
- Removing duplicates mistakenly
- Mixing node order
- Appending lists without sorting
Ready to prove it?
Pass the test and this pattern moves unknown
