Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions 0021.Merge-Two-Sorted-Lists/memo.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# 21. Merge Two Sorted Lists

## step1

10m 未満で解けた

## step2
解くだけなら簡単だが、ロジックが流暢かどうか

https://github.com/colorbox/leetcode/pull/5

破壊的な解法

> これも、
> ListNode * smaller = list1;
> ListNode * bigger = list2;
> としてからやっていたらそんなに違和感がないと思うんですよ。
> while(smaller && bigger){
> if(smaller->val > bigger->val){
> swap(smaller, bigger);
> }
> current->next = smaller;
> current = current->next;
> smaller = smaller->next;
> }

`smaller`, `bigger` という作業用ポインタに置き換えると分かりやすい。

片方が尽きたらそのまま後ろにつなげばよい。
31 changes: 31 additions & 0 deletions 0021.Merge-Two-Sorted-Lists/step1.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
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]:
node1 = list1
node2 = list2
dummy = ListNode()
merged = dummy

while node1 is not None or node2 is not None:
if node1 is None:
node1, node2 = node2, node1
if node2 is None or node1.val < node2.val:
merged.next = ListNode(val=node1.val)
node1 = node1.next
else:
merged.next = ListNode(val=node2.val)
node2 = node2.next
merged = merged.next

return dummy.next
59 changes: 59 additions & 0 deletions 0021.Merge-Two-Sorted-Lists/step2.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
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]:
sentinel = ListNode()
node = sentinel

node1 = list1
node2 = list2
while node1 is not None and node2 is not None:
if node1.val <= node2.val:
node.next = node1
node1 = node1.next
else:
node.next = node2
node2 = node2.next
node = node.next

node.next = node1 if node1 is not None else node2
return sentinel.next


# 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]:
sentinel = ListNode()
node = sentinel

node1 = list1
node2 = list2
while node1 is not None and node2 is not None:
if node1.val <= node2.val:
node.next = node1
node1 = node1.next
else:
node.next = node2
node2 = node2.next
node = node.next

node.next = node1 if node1 is not None else node2
return sentinel.next