Reference: LeetCode EPI 7.1
Difficulty: Easy
Problem
Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists (non-destructive).
Example:
1 | Input: 1->2->4, 1->3->4 |
Follow up:
- Space from $O(n + m)$ to $O(1)$.
- Solve the same problem when the lists are doubly linked. Marked
- Set previous node during the process.
Analysis
Naive Solution
Append the two lists together and sort the resulting list. But it does not use the fact that the two initial lists are sorted.
Time: $O((n + m)\log{(n + m)})$ (use witch sorting algorithm?)
Iteration
Note: When n1
or n2
becomes null, it is not necessary to walk through the rest nodes of the list.
1 | public ListNode iteration(ListNode n1, ListNode n2) { |
Time: $O(n + m)$, since each time exactly one of n1
or n2
will move by one step. The best case occurs when one list is much shorter
than the other and the values are less than
the ones in the other list.
Space: $O(1)$ because of pointers.
Recursion
We can define the result of a merge
operation on two lists as follows:
list1[0]
+ merge(list1[1:]
,list2
), whenlist1[0] < list2[0]
.list2[0]
+ merge(list1
,list2[1:]
), otherwise.
1 | // Example |
Note: Notice how to handle the corner cases.
1 | public ListNode recursion(ListNode n1, ListNode n2) { |
Improvement:
1 | private ListNode merge(ListNode n1, ListNode n2) { |
Time: $O(n + m)$, number of elements in two lists.
Space: $O(n + m)$, $n + m$ stack frames in total.