###### tags: `Week_1`, `Linked List`
# Linked List
## [21. Merge Two Sorted Lists](https://leetcode.com/problems/merge-two-sorted-lists/)
harry:
```ruby=
# Definition for singly-linked list.
# class ListNode
# attr_accessor :val, :next
# def initialize(val = 0, _next = nil)
# @val = val
# @next = _next
# end
# end
# @param {ListNode} list1
# @param {ListNode} list2
# @return {ListNode}
def merge_two_lists(list1, list2)
p1 = list1
p2 = list2
head = ListNode.new
p_ans = head
while p1 || p2
if p1.nil? || p2.nil?
head.next = p1 ? p1 : p2
break
end
if p1.val <= p2.val
chosen = p1
p1 = p1.next
else
chosen = p2
p2 = p2.next
end
head.next = ListNode.new(chosen.val)
head = head.next
end
p_ans.next
end
```
sam
```python=
class Solution:
def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
root=ptr=ListNode()
head1=list1
head2=list2
while head1 and head2:
if head1.val > head2.val:
ptr.next = ListNode(head2.val)
head2 = head2.next
else:
ptr.next = ListNode(head1.val)
head1 = head1.next
ptr = ptr.next
ptr.next = head1 or head2
return root.next
```
## [206. Reverse Linked List](https://leetcode.com/problems/reverse-linked-list/)
harry:
```ruby=
def reverse_list(head)
return head if head.nil?
pt = ListNode.new(0, head)
stack = []
stack.push(pt) while (pt = pt.next)
ans = node = stack.pop
node = node.next while (node.next = stack.pop)
ans
end
```
harry(recursive):
```ruby=
def reverse_list(head)
return head if head.nil? || head.next.nil?
original_head = head
new_head = reverse_two_nodes(head)
original_head.next = nil
new_head
end
def reverse_two_nodes(head)
new_head = if head.next.next.nil?
head.next
else
reverse_two_nodes(head.next)
end
head.next.next = head
new_head
end
```
Sam:
```python=
class Solution:
def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
prev = None
while head != None:
temp = head.next
head.next = prev
prev = head
head = temp
return prev
```
Beny:
``` csharp=
public ListNode ReverseList(ListNode head) {
ListNode ptr = head;
List<int> list =new List<int>();
while(ptr != null){
list.Add(ptr.val);
ptr = ptr.next;
}
ListNode result = new ListNode();
ListNode ptr1 = result;
for(int i = list.Count-1; i > -1; i--){
ptr1.next = new ListNode();
ptr1 = ptr1.next;
ptr1.val = list[i];
}
return result.next;
}
```
## [876. Middle of the Linked List](https://leetcode.com/problems/middle-of-the-linked-list)
harry:
```ruby=
def middle_node(head)
return head if head.next.nil?
node = head
s = 1
s += 1 while node = node.next
mid = (s / 2).ceil
node = head
0.upto(mid - 1) do
node = node.next
end
node
end
```
```ruby=
# use cycle-like
def middle_node(head)
slow = fast = head
while fast.next&.next
slow = slow.next
fast = fast.next.next
end
if fast.next
slow.next
else
slow
end
end
```
Sam:
```python=
class Solution:
def middleNode(self, head: Optional[ListNode]) -> Optional[ListNode]:
temp_list = []
while head != None:
temp_list.append(head)
head = head.next
if len(temp_list) == 1:
return temp_list[0]
else:
return temp_list[len(temp_list) // 2]
```
```python=
# OP. 2 pointer
class Solution:
def middleNode(self, head: Optional[ListNode]) -> Optional[ListNode]:
temp_list = []
slow = fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
return slow
# Because one of the prob. condition is "return second position if the linked list has two middle points."
```
beny:
```csharp=
public class Solution {
public ListNode MiddleNode(ListNode head) {
ListNode root = head;
ListNode ptr = head;
ListNode result = head;
bool go = false;
while(ptr != null){
if(go){
ptr = ptr.next;
result = result.next;
go = false;
}else{
ptr = ptr.next;
go = true;
}
}
return result;
}
}
```
## [142. Linked List Cycle II](https://leetcode.com/problems/linked-list-cycle-ii)
harry:
```ruby=
def detectCycle(head)
return if head.nil?
return head if head.next&.next == head
slow = fast = head
has_cycle = false
while fast.next&.next
slow = slow.next
fast = fast.next.next
if slow == fast
has_cycle = true
break
end
end
if has_cycle
begin
head = head.next
fast = fast.next
end while head != fast
fast
end
end
```
Sam:
* Simple way: record every node in hash map & check if exist.
* Advanded way: Floyd cycle detection.
```python=
class Solution:
def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:
if head is None or head.next is None:
return None
slow=fast=head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
if slow == fast:
break
if fast != slow:
return None
slow = head
while slow != fast:
slow = slow.next
fast = fast.next
return slow
```
beny:
```csharp=
public class Solution {
public ListNode DetectCycle(ListNode head) {
ListNode root = head;
ListNode result = root;
Dictionary <ListNode,ListNode> resultMap = new Dictionary <ListNode,ListNode>();
while(result != null){
if(!resultMap.ContainsKey(result)){
resultMap.Add(result,result);
result = result.next;
}else{
return(resultMap[result]);
}
}
return null;
}
}
```