###### tags: `leetcode` `recursive`
# 21. Merge Two Sorted Lists
```python=
class Solution:
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
def f(cur, l1, l2):
print(l1 != None, l2 != None)
print(l1)
print(l2)
if l1 != None and l2 != None:
if l1.val <= l2.val:
cur.next = l1
l1 = l1.next
else:
cur.next = l2
l2 = l2.next
cur = cur.next
f(cur, l1, l2)
dh = ListNode(-1)
cur= dh # dummy head
f(cur, l1, l2)
print(l1 != None, l2 != None)
print(l1)
print(l2)
if l1 == None:
print("no l1", l2)
cur.next = l2
if l2 == None:
cur.next = l1
print("no l2", l1)
return dh.next
```
The `l1` and `l2` after `f()` is still the same as original.
How to make the manipulation on `l1` and `l2` in `f()` be permanent, even after `f()` is finished?
## h2
# Iterative
- Need three pointers, why three?
- We will definitely do: [`previous_node.next`](http://node.next) ←`a_node_from_list_1`
- and also do: [`previous_node.next`](http://node.next) ←`a_node_from_list_2`
- So, three pointers.
- Create a dummy head or compare to know the first node.
- A dummy head sometimes is the core to solve a problem.
- Compare the heads of two LLs, take the larger, attach to answer_LL
- If one LL is depleted, attach the other whole LL to eh answer_LL
# recursive
- scratch an outline, the main code calling the recursive soln(); or recursive helper inside soln()
- depends if we need pre/post-process which should not be recursive
- how to connect caller and the called
- need to collect all output of the called, and then combine? // will it fanout?
- combine: AND OR sum() multiply()
- or we only need one among branches
- or we use global var accessible by all recursive children to store answer
- global var as inputreference data/
- be caution of name scope, pass/copy by value or by reference
- counting down
- termination/base case
- memorization/cache
```python
def soln(LL1, LL2):
def helper(???):
if is_termination:
# do things
return foo
else:
# do things
return helper(??? +-*/ $$$) +-*/ @@@
# can put to main snippet
# some preprocessing, only once. Shall not in recursion.
helper_output = helper(...)
# some postpocessing, only once. Shall not in recursion.
return answer
if __name__ == "__main__":
LL1 = ...
LL2 = ...
answer_LL = soln(LL1, LL2)
print(anser_LL)
```
```python
def soln(LL1, LL2):
if is_terminated:
# do things
return base_case
else
# do things
return soln(altered_input) +-*/ sth
if __name__ == "__main__":
LL1 = ...
LL2 = ...
answer_LL = soln(LL1, LL2)
print(anser_LL)
```
```python
class Solution:
def mergeTwoLists(self, l1, l2):
if l1 is None:
return l2
elif l2 is None:
return l1
elif l1.val < l2.val:
l1.next = self.mergeTwoLists(l1.next, l2)
return l1
else:
l2.next = self.mergeTwoLists(l1, l2.next)
return l2
```