diff --git a/ArrayAndLink/LinkedList/Kilien/LeetCode 148.Sort List.jpg b/ArrayAndLink/LinkedList/Kilien/LeetCode 148.Sort List.jpg new file mode 100644 index 0000000000000000000000000000000000000000..751a7c57cafc63e722f8be9225867f93e4b58e26 Binary files /dev/null and b/ArrayAndLink/LinkedList/Kilien/LeetCode 148.Sort List.jpg differ diff --git a/ArrayAndLink/LinkedList/Kilien/Leetcode 141.Linked List Cycle.jpg b/ArrayAndLink/LinkedList/Kilien/Leetcode 141.Linked List Cycle.jpg new file mode 100755 index 0000000000000000000000000000000000000000..f4f453020e9ceec4b6fffe72a95489306afabe61 Binary files /dev/null and b/ArrayAndLink/LinkedList/Kilien/Leetcode 141.Linked List Cycle.jpg differ diff --git a/ArrayAndLink/LinkedList/Kilien/Leetcode 206.Reverse Linked List.jpg b/ArrayAndLink/LinkedList/Kilien/Leetcode 206.Reverse Linked List.jpg new file mode 100755 index 0000000000000000000000000000000000000000..91d6549221b27f1bc80f3725fd903112c7c1886b Binary files /dev/null and b/ArrayAndLink/LinkedList/Kilien/Leetcode 206.Reverse Linked List.jpg differ diff --git a/ArrayAndLink/LinkedList/Kilien/Leetcode 24.Swap Nodes in Pairs.jpg b/ArrayAndLink/LinkedList/Kilien/Leetcode 24.Swap Nodes in Pairs.jpg new file mode 100755 index 0000000000000000000000000000000000000000..77ef0c7f745c25028983d72680812a634f75a269 Binary files /dev/null and b/ArrayAndLink/LinkedList/Kilien/Leetcode 24.Swap Nodes in Pairs.jpg differ diff --git a/ArrayAndLink/LinkedList/Kilien/LinkedListCycle.py b/ArrayAndLink/LinkedList/Kilien/LinkedListCycle.py new file mode 100755 index 0000000000000000000000000000000000000000..c81783ee480ec4ed6de89f6f7fd53c5476812aca --- /dev/null +++ b/ArrayAndLink/LinkedList/Kilien/LinkedListCycle.py @@ -0,0 +1,41 @@ +# Author:kilien +# Leetcode 141.Linked List Cycle +# 思路1:使用set记录链表元素,重复即有环 +# time:O(n) space:O(n) +# Definition for singly-linked list. +# class ListNode(object): +# def __init__(self, x): +# self.val = x +# self.next = None +class Solution(object): + def hasCycle(self, head): + """ + :type head: ListNode + :rtype: bool + """ + key = set() + while head: + if head in key: + return True + else: + key.add(head) + head = head.next + return False + + +# 思路2:使用快慢指针,当两者相遇则有环 +# time:O(n) space:O(1) + +class Solution(object): + def hasCycle(self, head): + """ + :type head: ListNode + :rtype: bool + """ + fast = slow = head + while fast and slow and fast.next: + fast = fast.next.next + slow = slow.next + if fast is slow: + return True + return False \ No newline at end of file diff --git a/ArrayAndLink/LinkedList/Kilien/SortList.py b/ArrayAndLink/LinkedList/Kilien/SortList.py new file mode 100644 index 0000000000000000000000000000000000000000..5926bbc6c128952246c90f698d93d6fb7aac19cf --- /dev/null +++ b/ArrayAndLink/LinkedList/Kilien/SortList.py @@ -0,0 +1,31 @@ +# Author:kilien +# 思路:归并排序,分解链表,化整为零,再自底向上合并排序 +# time:O(nlogn) space:O(nloagn) +# Definition for singly-linked list. +# class ListNode: +# def __init__(self, x): +# self.val = x +# self.next = None + +class Solution(object): + def merge(self, h1, h2): + dummy = tail = ListNode(None) + while h1 and h2: + if h1.val < h2.val: + tail.next, tail, h1 = h1, h1, h1.next + else: + tail.next, tail, h2 = h2, h2, h2.next + + tail.next = h1 or h2 + return dummy.next + + def sortList(self, head): + if not head or not head.next: + return head + + pre, slow, fast = None, head, head + while fast and fast.next: + pre, slow, fast = slow, slow.next, fast.next.next + pre.next = None + + return self.merge(*map(self.sortList, (head, slow))) diff --git a/ArrayAndLink/LinkedList/Kilien/SwapNodesinPairs.py b/ArrayAndLink/LinkedList/Kilien/SwapNodesinPairs.py new file mode 100755 index 0000000000000000000000000000000000000000..55bb6522b523177f6c3f19c3e387b70b6ee09b52 --- /dev/null +++ b/ArrayAndLink/LinkedList/Kilien/SwapNodesinPairs.py @@ -0,0 +1,18 @@ +#Author:kilien +#Leetcode 24.Swap Nodes in Pairs +#思路:定义哨兵节点,互换相邻节点及后继节点,详见图解 +#time:O(n) space:O(n) +# Definition for singly-linked list. +# class ListNode: +# def __init__(self, x): +# self.val = x +# self.next = None +class Solution: + def swapPairs(self, head: ListNode) -> ListNode: + pre, pre.next = self, head + while pre.next and pre.next.next: + a = pre.next + b = a.next + pre.next, b.next, a.next = b, a, b.next + pre = a + return self.next diff --git a/ArrayAndLink/LinkedList/Kilien/reverse-linked-list.py b/ArrayAndLink/LinkedList/Kilien/reverse-linked-list.py new file mode 100755 index 0000000000000000000000000000000000000000..d7161c5d69d9f9f6d6d4d81f7bc5da78447e4655 --- /dev/null +++ b/ArrayAndLink/LinkedList/Kilien/reverse-linked-list.py @@ -0,0 +1,17 @@ +#author:kilien +#Leetcode 206.Reverse Linked List +#思路:定义两个指针,指向前继节点和当前节点 +#多元赋值,两两互换 +#time:O(n) space:O(1) +# Definition for singly-linked list. +# class ListNode: +# def __init__(self, x): +# self.val = x +# self.next = None + +class Solution: + def reverseList(self, head: ListNode) -> ListNode: + cur, prev = head, None + while cur: + cur.next, prev, cur = prev, cur, cur.next + return prev \ No newline at end of file