diff --git a/DataStructureAndAlgorithm/08 Leetcode同步练习(三).md b/DataStructureAndAlgorithm/08 Leetcode同步练习(三).md new file mode 100644 index 0000000..11215b2 --- /dev/null +++ b/DataStructureAndAlgorithm/08 Leetcode同步练习(三).md @@ -0,0 +1,794 @@ + +# Leetcodeͬϰ + + +## Ŀ01ϲ + +> - ţ21 +> - Ѷȣ +> - https://leetcode-cn.com/problems/merge-two-sorted-lists/ + +ϲΪһµءͨƴӸнڵɵġ + +**ʾ** + +```c +룺1->2->4, 1->3->4 +1->1->2->3->4->4 +``` + +**ο** + +- ִнͨ +- ִʱ108 ms, C# ύл 83.80% û +- ڴģ25.9 MB, C# ύл 5.85% û + +```c +/** + * Definition for singly-linked list. + * public class ListNode { + * public int val; + * public ListNode next; + * public ListNode(int x) { val = x; } + * } + */ +public class Solution +{ + public ListNode MergeTwoLists(ListNode l1, ListNode l2) + { + ListNode pHead = new ListNode(int.MaxValue); + ListNode temp = pHead; + + while (l1 != null && l2 != null) + { + if (l1.val < l2.val) + { + temp.next = l1; + l1 = l1.next; + } + else + { + temp.next = l2; + l2 = l2.next; + } + temp = temp.next; + } + + if (l1 != null) + temp.next = l1; + + if (l2 != null) + temp.next = l2; + + return pHead.next; + } +} +``` + +--- +## Ŀ02ɾеظԪ + +> - ţ83 +> - Ѷȣ +> - https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list/ + + +һɾظԪأʹÿԪֻһΡ + + +**ʾ 1:** + +```c +: 1->1->2 +: 1->2 +``` + +**ʾ 2:** +```c +: 1->1->2->3->3 +: 1->2->3 +``` + +**˼·**˫ָķʽ + +`p1`Ϊǰָ̽·`p2`ΪָظԪأ`p2.next`ȥ`p1`ظԪضժ + +**ο** + +- ִнͨ +- ִʱ160 ms, C# ύл 5.23% û +- ڴģ25.9 MB, C# ύл 5.72% û + +```c +/** + * Definition for singly-linked list. + * public class ListNode { + * public int val; + * public ListNode next; + * public ListNode(int x) { val = x; } + * } + */ + +public class Solution +{ + public ListNode DeleteDuplicates(ListNode head) + { + if (head == null) + return head; + + ListNode p1 = head.next; + ListNode p2 = head; + while (p1 != null) + { + if (p1.val == p2.val) + p2.next = p1.next; + else + p2 = p2.next; + p1 = p1.next; + } + return head; + } +} +``` + +--- +## Ŀ03 + +> - ţ141 +> - Ѷȣ +> - https://leetcode-cn.com/problems/linked-list-cycle/ + +һжǷл + +Ϊ˱ʾеĻʹ`pos` ʾβӵеλã 0 ʼ `pos` -1ڸûл + +ʾ 1 +```c +룺head = [3,2,0,-4], pos = 1 +true +ͣһβӵڶڵ㡣 +``` + +![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hc3NldHMubGVldGNvZGUtY24uY29tL2FsaXl1bi1sYy11cGxvYWQvdXBsb2Fkcy8yMDE4LzEyLzA3L2NpcmN1bGFybGlua2VkbGlzdC5wbmc) + +ʾ 2 +```c +룺head = [1,2], pos = 0 +true +ͣһβӵһڵ㡣 +``` +![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hc3NldHMubGVldGNvZGUtY24uY29tL2FsaXl1bi1sYy11cGxvYWQvdXBsb2Fkcy8yMDE4LzEyLzA3L2NpcmN1bGFybGlua2VkbGlzdF90ZXN0Mi5wbmc) + +ʾ 3 +```c +룺head = [1], pos = -1 +false +ͣûл +``` +![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hc3NldHMubGVldGNvZGUtY24uY29tL2FsaXl1bi1sYy11cGxvYWQvdXBsb2Fkcy8yMDE4LzEyLzA3L2NpcmN1bGFybGlua2VkbGlzdF90ZXN0My5wbmc) + + + + O(1)ڴ + +**˼·**˫ָķʽ + +ͨ£жǷظԪأʹ`Hash`ķʽڵֳҲʹ˫ָķʽ + +һָ `p1` ÿƶڵ㣬ڶָ `p2` ÿƶһڵ㣬ڻĻһָһٴڶָ룬֮򲻴ڻ + +磺`head = [1,2,3,4,5]` + +```c +p11 3 5 2 4 1 +p21 2 3 4 5 1 +``` + +磺`head = [1,2,3,4]`ż +```c +p11 3 1 3 1 +p21 2 3 4 1 +``` + +**ο** + +- ״̬ͨ +- ִʱ: 112 ms, C# ύл 98.43% û +- ڴ: 24.9 MB, C# ύл 5.13% û + +```c +/** + * Definition for singly-linked list. + * public class ListNode { + * public int val; + * public ListNode next; + * public ListNode(int x) { + * val = x; + * next = null; + * } + * } + */ +public class Solution { + public bool HasCycle(ListNode head) { + ListNode p1 = head; + ListNode p2 = head; + + while (p1 != null && p1.next != null) + { + p1 = p1.next.next; + p2 = p2.next; + if (p1 == p2) + return true; + } + return false; + } +} +``` + +## Ŀ04ת + + +> - ţ206 +> - Ѷȣ +> - https://leetcode-cn.com/problems/reverse-linked-list/ + +תһ + +ʾ: +```c +: 1->2->3->4->5->NULL +: 5->4->3->2->1->NULL +``` + +: + +Եݹطתַܷ⣿ + +**˼·**˫ָķʽ + +`p1`Ϊǰָ̽·`p2`Ϊָ˳һȦ㶨⡣ + +**ο** + +- ״̬ͨ +- ִʱ: 116 ms, C# ύл 97.50% û +- ڴ: 23.3 MB, C# ύл 5.26% û + +```c +/** + * Definition for singly-linked list. + * public class ListNode { + * public int val; + * public ListNode next; + * public ListNode(int x) { val = x; } + * } + */ + +public class Solution +{ + public ListNode ReverseList(ListNode head) + { + if (head == null || head.next == null) + return head; + + ListNode p1 = head; + ListNode p2 = null; + while (p1 != null) + { + ListNode temp = p1.next; + p1.next = p2; + p2 = p1; + p1 = temp; + } + return p2; + } +} +``` + +--- +## Ŀ05ɾеĽڵ + +> - ţ237 +> - Ѷȣ +> - https://leetcode-cn.com/problems/delete-node-in-a-linked-list/ + +дһʹɾijиģĩβڵ㣬㽫ֻҪɾĽڵ㡣 + +һ -- head = [4,5,1,9]ԱʾΪ: + +![](https://img-blog.csdnimg.cn/20190920111622847.png) + + +ʾ 1: +```c +: head = [4,5,1,9], node = 5 +: [4,1,9] +: ֵΪ 5 ĵڶڵ㣬ôڵĺ֮󣬸ӦΪ 4 -> 1 -> 9. +``` + +ʾ 2: +```c +: head = [4,5,1,9], node = 1 +: [4,5,9] +: ֵΪ 1 ĵڵ㣬ôڵĺ֮󣬸ӦΪ 4 -> 5 -> 9. +``` + +˵: + +- ٰڵ㡣 +- нڵֵΨһġ +- ĽڵΪĩβڵ㲢һеһЧڵ㡣 +- Ҫĺзκν + + + +**˼·** ûиͷڵ㣬ֱӸҪɾĽڵ㣬ǽԭɾǶڸýڵǰһڵһ֪޷ֱִɾˣǽҪɾڵ next ڵֵֵҪɾĽڵ㣬תȥɾ next ڵ㣬ӶĿġ + +**ο** + +- ״̬ͨ +- 41 / 41 ͨ +- ִʱ: 120 ms, C# ύл 99.55% û +- ڴ: 24.4 MB, C# ύл 5.88% û + +```c +/** + * Definition for singly-linked list. + * public class ListNode { + * public int val; + * public ListNode next; + * public ListNode(int x) { val = x; } + * } + */ + +public class Solution +{ + public void DeleteNode(ListNode node) + { + ListNode temp = node.next; + while (temp != null) + { + node.val = temp.val; + temp = temp.next; + if (temp != null) + { + node = node.next; + } + } + node.next = null; + } +} +``` + + + +--- +## Ŀ06 + +> - ţ2 +> - Ѷȣе +> - https://leetcode-cn.com/problems/add-two-numbers/ + + ǿ ʾǸУǸԵλǰ ķʽ洢ģǵÿڵֻܴ洢 һλ ֡ + +ǽ᷵һµʾǵĺ͡ + +Լ 0 ֮⣬ 0 ͷ + +ʾ 1 +```c +룺(2 -> 4 -> 3) + (5 -> 6 -> 4) +7 -> 0 -> 8 +ԭ342 + 465 = 807 +``` + +ʾ 2 +```c +룺(3 -> 7) + (9 -> 2) +2 -> 0 -> 1 +ԭ73 + 29 = 102 +``` + +**˼·**ģСѧʱѧļӷ㡣λӳʮһʮλнλϽλơ + +ο룺 + +- ״̬ͨ +- ִʱ: 144 ms, C# ύл 97.98% û +- ڴ: 26.7 MB, C# ύл 5.07% û + +```c +/** + * Definition for singly-linked list. + * public class ListNode { + * public int val; + * public ListNode next; + * public ListNode(int x) { val = x; } + * } + */ +public class Solution +{ + public ListNode AddTwoNumbers(ListNode l1, ListNode l2) + { + ListNode result = new ListNode(-1); + ListNode l3 = result; + int flag = 0; + while (l1 != null && l2 != null) + { + int a = l1.val; + int b = l2.val; + int c = a + b + flag; + l3.next = new ListNode(c%10); + + flag = c >= 10 ? 1 : 0; + l1 = l1.next; + l2 = l2.next; + l3 = l3.next; + } + + while (l1 != null) + { + int a = l1.val + flag; + + l3.next = new ListNode(a%10); + + flag = a >= 10 ? 1 : 0; + l1 = l1.next; + l3 = l3.next; + } + + while (l2 != null) + { + int b = l2.val + flag; + + l3.next = new ListNode(b%10); + flag = b >= 10 ? 1 : 0; + l2 = l2.next; + l3 = l3.next; + } + + if (flag == 1) + { + l3.next = new ListNode(flag); + } + return result.next; + } +} +``` + +--- +## Ŀ07ɾĵNڵ + +> - ţ19 +> - Ѷȣе +> - https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/ + +һɾĵ`n`ڵ㣬ҷͷ㡣 + +**ʾ** + +```c +һ: 1->2->3->4->5, n = 2. + +ɾ˵ڶڵΪ 1->2->3->5. +``` + +**˵** + +`n`֤Чġ + +**** + +ܳʹһɨʵ + +**˼·** ʹָ룬ǰָ`p1``n`úָ`p2``p1`ͬߣ`p1`ߵյ㣬`p2`ߵҪƳĽλá + +**ο룺** +- ִнͨ +- ִʱ104 ms, C# ύл 86.93% û +- ڴģ24.6 MB, C# ύл 100.00% û + +```c +/** + * Definition for singly-linked list. + * public class ListNode { + * public int val; + * public ListNode next; + * public ListNode(int x) { val = x; } + * } + */ +public class Solution +{ + public ListNode RemoveNthFromEnd(ListNode head, int n) + { + ListNode p1 = head; + ListNode p2 = head; + + while (n > 0) + { + p1 = p1.next; + n--; + } + + if (p1 == null) //Ƴͷ + { + return head.next; + } + + while (p1.next != null) + { + p1 = p1.next; + p2 = p2.next; + } + + p2.next = p2.next.next; + return head; + } +} +``` + + +--- +## Ŀ08еĽڵ + +> - ţ24 +> - Ѷȣе +> - https://leetcode-cn.com/problems/swap-nodes-in-pairs/ + +һڵĽڵ㣬ؽ + +**㲻ֻǵĸıڵڲֵ**ҪʵʵĽнڵ㽻 + + + +**ʾ:** + +> 1->2->3->4, Ӧ÷ 2->1->4->3. + + +**ο** + +- ִнͨ +- ִʱ100 ms, C# ύл 93.18% û +- ڴģ23.4 MB, C# ύл 87.72% û + +```c +/** + * Definition for singly-linked list. + * public class ListNode { + * public int val; + * public ListNode next; + * public ListNode(int x) { val = x; } + * } + */ + +public class Solution +{ + public ListNode SwapPairs(ListNode head) + { + if (head == null || head.next == null) + return head; + + head = Swap(head); + + ListNode temp = head.next; + + while (temp != null && temp.next != null) + { + temp.next = Swap(temp.next); + if (temp.next != null) + { + temp = temp.next.next; + } + } + return head; + } + + public ListNode Swap(ListNode node) + { + if (node == null || node.next == null) + return node; + + ListNode t = node.next; + node.next = t.next; + t.next = node; + return t; + } +} +``` + +--- +## Ŀ09ת + + +> - ţ61 +> - Ѷȣе +> - https://leetcode-cn.com/problems/rotate-list/ + +һתÿڵƶ k λã k ǷǸ + +**ʾ 1:** + +```c +: 1->2->3->4->5->NULL, k = 2 +: 4->5->1->2->3->NULL + +: +ת 1 : 5->1->2->3->4->NULL +ת 2 : 4->5->1->2->3->NULL +``` + +**ʾ 2:** + +```c +: 0->1->2->NULL, k = 4 +: 2->0->1->NULL + +: +ת 1 : 2->0->1->NULL +ת 2 : 1->2->0->NULL +ת 3 : 0->1->2->NULL +ת 4 : 2->0->1->NULL +``` + + + + +**ο** + +- ִнͨ +- ִʱ100 ms, C# ύл 98.13% û +- ڴģ25.1 MB, C# ύл 100.00% û + + +```c +/** + * Definition for singly-linked list. + * public class ListNode { + * public int val; + * public ListNode next; + * public ListNode(int x) { val = x; } + * } + */ + +public class Solution +{ + public ListNode RotateRight(ListNode head, int k) + { + if (head == null || k == 0) + return head; + + int len = GetLength(head); + int index = len - k%len; + + if (index == len) + return head; + + ListNode temp1 = head; + ListNode temp2 = head; + for (int i = 0; i < index - 1; i++) + { + temp1 = temp1.next; + } + head = temp1.next; + temp1.next = null; + + temp1 = head; + while (temp1.next != null) + { + temp1 = temp1.next; + } + temp1.next = temp2; + return head; + } + + public int GetLength(ListNode head) + { + ListNode temp = head; + int i = 0; + while (temp != null) + { + i++; + temp = temp.next; + } + return i; + } +} +``` + + + +--- +## Ŀ10ϲK + +> - ţ23 +> - Ѷȣ +> - https://leetcode-cn.com/problems/merge-k-sorted-lists/ + + +ϲ k غϲ㷨ĸӶȡ + +ʾ: +```c +: +[ + 1->4->5, + 1->3->4, + 2->6 +] +: 1->1->2->3->4->4->5->6 +``` + +˼·ϲķʽ + +ϲõһµķ`ListNode MergeTwoLists(ListNode l1, ListNode l2)`ʹø÷ϲǰõһµ֮ϲƣõϲ`K`бб + + +**ο** + +- ִнͨ +- ִʱ256 ms, C# ύл 36.69% û +- ڴģ29.3 MB, C# ύл 18.37% û + + +```c +/** + * Definition for singly-linked list. + * public class ListNode { + * public int val; + * public ListNode next; + * public ListNode(int x) { val = x; } + * } + */ +public class Solution +{ + public ListNode MergeTwoLists(ListNode l1, ListNode l2) + { + ListNode pHead = new ListNode(int.MaxValue); + ListNode temp = pHead; + + while (l1 != null && l2 != null) + { + if (l1.val < l2.val) + { + temp.next = l1; + l1 = l1.next; + } + else + { + temp.next = l2; + l2 = l2.next; + } + temp = temp.next; + } + + if (l1 != null) + temp.next = l1; + + if (l2 != null) + temp.next = l2; + + return pHead.next; + } + + public ListNode MergeKLists(ListNode[] lists) { + if (lists.Length == 0) + return null; + + ListNode result = lists[0]; + for (int i = 1; i < lists.Length; i++) + { + result = MergeTwoLists(result, lists[i]); + } + return result; + } +} +``` + + + + + + + + diff --git a/DataStructureAndAlgorithm/08 队列.md b/DataStructureAndAlgorithm/10 队列.md similarity index 100% rename from DataStructureAndAlgorithm/08 队列.md rename to DataStructureAndAlgorithm/10 队列.md diff --git a/DataStructureAndAlgorithm/10 字符串.md b/DataStructureAndAlgorithm/11 字符串.md similarity index 100% rename from DataStructureAndAlgorithm/10 字符串.md rename to DataStructureAndAlgorithm/11 字符串.md