Add merge_two_linked_lists solution
This commit is contained in:
parent
8bf8740e48
commit
5cafe951db
3 changed files with 268 additions and 0 deletions
143
neetcode/linked_list/merge_two_linked_lists/README.md
Normal file
143
neetcode/linked_list/merge_two_linked_lists/README.md
Normal file
|
@ -0,0 +1,143 @@
|
||||||
|
Merge Two Sorted Linked Lists
|
||||||
|
You are given the heads of two sorted linked lists list1 and list2.
|
||||||
|
|
||||||
|
Merge the two lists into one sorted linked list and return the head of the new sorted linked list.
|
||||||
|
|
||||||
|
The new list should be made up of nodes from list1 and list2.
|
||||||
|
|
||||||
|
Example 1:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Input: list1 = [1,2,4], list2 = [1,3,5]
|
||||||
|
|
||||||
|
Output: [1,1,2,3,4,5]
|
||||||
|
Example 2:
|
||||||
|
|
||||||
|
Input: list1 = [], list2 = [1,2]
|
||||||
|
|
||||||
|
Output: [1,2]
|
||||||
|
Example 3:
|
||||||
|
|
||||||
|
Input: list1 = [], list2 = []
|
||||||
|
|
||||||
|
Output: []
|
||||||
|
Constraints:
|
||||||
|
|
||||||
|
0 <= The length of the each list <= 100.
|
||||||
|
-100 <= Node.val <= 100
|
||||||
|
|
||||||
|
# Solution
|
||||||
|
|
||||||
|
## Edge cases
|
||||||
|
### Two empty
|
||||||
|
l1 = []
|
||||||
|
l2 = []
|
||||||
|
|
||||||
|
r = None
|
||||||
|
### l1 empty
|
||||||
|
l1 = []
|
||||||
|
l2 = [1,2,...,n]
|
||||||
|
|
||||||
|
r = l2
|
||||||
|
### l2 empty
|
||||||
|
l1 = [1,2,...,n]
|
||||||
|
l2 = []
|
||||||
|
|
||||||
|
r = l1
|
||||||
|
|
||||||
|
## Algorithm
|
||||||
|
### 0
|
||||||
|
i
|
||||||
|
l1 = [1,2,4]
|
||||||
|
|
||||||
|
j
|
||||||
|
l2 = [1,3,5]
|
||||||
|
|
||||||
|
r = []
|
||||||
|
|
||||||
|
### 1
|
||||||
|
Before:
|
||||||
|
|
||||||
|
i
|
||||||
|
l1 = [1,2,4]
|
||||||
|
|
||||||
|
j
|
||||||
|
l2 = [1,3,5]
|
||||||
|
|
||||||
|
r = []
|
||||||
|
|
||||||
|
Step:
|
||||||
|
```
|
||||||
|
if i.val <= j.val:
|
||||||
|
r = i
|
||||||
|
i = i.next
|
||||||
|
```
|
||||||
|
|
||||||
|
After:
|
||||||
|
|
||||||
|
i
|
||||||
|
l1 = [1,2,4]
|
||||||
|
|
||||||
|
j
|
||||||
|
l2 = [1,3,5]
|
||||||
|
|
||||||
|
r = [l10]
|
||||||
|
|
||||||
|
### 2
|
||||||
|
Before:
|
||||||
|
i
|
||||||
|
l1 = [1,2,4]
|
||||||
|
|
||||||
|
j
|
||||||
|
l2 = [1,3,5]
|
||||||
|
|
||||||
|
r = [l10]
|
||||||
|
|
||||||
|
Step:
|
||||||
|
```
|
||||||
|
if i.val <= j.val:
|
||||||
|
---
|
||||||
|
else:
|
||||||
|
r.next = j
|
||||||
|
j = j.next
|
||||||
|
r = r.next
|
||||||
|
```
|
||||||
|
After:
|
||||||
|
i
|
||||||
|
l1 = [1,2,4]
|
||||||
|
|
||||||
|
j
|
||||||
|
l2 = [1,3,5]
|
||||||
|
|
||||||
|
r = [l10, l20]
|
||||||
|
|
||||||
|
### 3
|
||||||
|
Before:
|
||||||
|
i
|
||||||
|
l1 = [1,2,4]
|
||||||
|
|
||||||
|
j
|
||||||
|
l2 = [1,3,5]
|
||||||
|
|
||||||
|
r = [l10, l20]
|
||||||
|
|
||||||
|
Step:
|
||||||
|
```
|
||||||
|
if i.val <= j.val:
|
||||||
|
r.next = i
|
||||||
|
i = i.next
|
||||||
|
r = r.next
|
||||||
|
else:
|
||||||
|
r.next = j
|
||||||
|
j = j.next
|
||||||
|
r = r.next
|
||||||
|
```
|
||||||
|
After:
|
||||||
|
j
|
||||||
|
l1 = [1,2,4]
|
||||||
|
|
||||||
|
j
|
||||||
|
l2 = [1,3,5]
|
||||||
|
|
||||||
|
r = [l10, l20, l11]
|
76
neetcode/linked_list/merge_two_linked_lists/main.py
Normal file
76
neetcode/linked_list/merge_two_linked_lists/main.py
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
|
|
||||||
|
# Definition for singly-linked list.
|
||||||
|
class ListNode:
|
||||||
|
def __init__(self, val=0, next=None):
|
||||||
|
self.val = val
|
||||||
|
self.next = next
|
||||||
|
|
||||||
|
|
||||||
|
class Solution:
|
||||||
|
def mergeTwoLists(
|
||||||
|
self, list1: Optional[ListNode], list2: Optional[ListNode]
|
||||||
|
) -> Optional[ListNode]:
|
||||||
|
if not list1 and not list2:
|
||||||
|
return None
|
||||||
|
if not list1 and isinstance(list2, ListNode):
|
||||||
|
return list2
|
||||||
|
if not list2 and isinstance(list1, ListNode):
|
||||||
|
return list1
|
||||||
|
i = list1
|
||||||
|
j = list2
|
||||||
|
r = None
|
||||||
|
rf = None
|
||||||
|
while i or j:
|
||||||
|
print(f"i : {i.val if i else 'No value'}\nj : {j.val if j else 'No value'}\n")
|
||||||
|
if not j:
|
||||||
|
r.next = i
|
||||||
|
i = i.next
|
||||||
|
r = r.next
|
||||||
|
continue
|
||||||
|
if not i:
|
||||||
|
r.next = j
|
||||||
|
j = j.next
|
||||||
|
r = r.next
|
||||||
|
continue
|
||||||
|
if i.val <= j.val:
|
||||||
|
if not r:
|
||||||
|
r = i
|
||||||
|
rf = i
|
||||||
|
else:
|
||||||
|
r.next = i
|
||||||
|
r = r.next
|
||||||
|
i = i.next
|
||||||
|
else:
|
||||||
|
if not r:
|
||||||
|
r = j
|
||||||
|
rf = j
|
||||||
|
else:
|
||||||
|
r.next = j
|
||||||
|
r = r.next
|
||||||
|
j = j.next
|
||||||
|
return rf
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
s = Solution()
|
||||||
|
# l12 = ListNode(val=4, next=None)
|
||||||
|
# l11 = ListNode(val=2, next=l12)
|
||||||
|
# l10 = ListNode(val=1, next=l11)
|
||||||
|
#
|
||||||
|
# l22 = ListNode(val=5, next=None)
|
||||||
|
# l21 = ListNode(val=3, next=l22)
|
||||||
|
# l20 = ListNode(val=1, next=l21)
|
||||||
|
|
||||||
|
l11 = ListNode(val=3, next=None)
|
||||||
|
l10 = ListNode(val=-9, next=l11)
|
||||||
|
|
||||||
|
l21 = ListNode(val=7, next=None)
|
||||||
|
l20 = ListNode(val=5, next=l21)
|
||||||
|
|
||||||
|
k = s.mergeTwoLists(list1=l10, list2=l20)
|
||||||
|
|
||||||
|
while k:
|
||||||
|
print(f"{k.val}")
|
||||||
|
k = k.next
|
|
@ -0,0 +1,49 @@
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
|
|
||||||
|
# Definition for singly-linked list.
|
||||||
|
class ListNode:
|
||||||
|
def __init__(self, val=0, next=None):
|
||||||
|
self.val = val
|
||||||
|
self.next = next
|
||||||
|
|
||||||
|
|
||||||
|
class Solution:
|
||||||
|
def mergeTwoLists(self, list1: ListNode, list2: ListNode) -> ListNode:
|
||||||
|
dummy = node = ListNode()
|
||||||
|
|
||||||
|
while list1 and list2:
|
||||||
|
if list1.val < list2.val:
|
||||||
|
node.next = list1
|
||||||
|
list1 = list1.next
|
||||||
|
else:
|
||||||
|
node.next = list2
|
||||||
|
list2 = list2.next
|
||||||
|
node = node.next
|
||||||
|
|
||||||
|
node.next = list1 or list2
|
||||||
|
|
||||||
|
return dummy.next
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
s = Solution()
|
||||||
|
# l12 = ListNode(val=4, next=None)
|
||||||
|
# l11 = ListNode(val=2, next=l12)
|
||||||
|
# l10 = ListNode(val=1, next=l11)
|
||||||
|
#
|
||||||
|
# l22 = ListNode(val=5, next=None)
|
||||||
|
# l21 = ListNode(val=3, next=l22)
|
||||||
|
# l20 = ListNode(val=1, next=l21)
|
||||||
|
|
||||||
|
l11 = ListNode(val=3, next=None)
|
||||||
|
l10 = ListNode(val=-9, next=l11)
|
||||||
|
|
||||||
|
l21 = ListNode(val=7, next=None)
|
||||||
|
l20 = ListNode(val=5, next=l21)
|
||||||
|
|
||||||
|
k = s.mergeTwoLists(list1=l10, list2=l20)
|
||||||
|
|
||||||
|
while k:
|
||||||
|
print(f"{k.val}")
|
||||||
|
k = k.next
|
Loading…
Reference in a new issue