LeetCode Summary Linked List

来源:互联网 发布:萨德对中国的影响 知乎 编辑:程序博客网 时间:2024/06/02 19:27
============================== Linked List ============================


复制
138. Copy List with Random Pointer(复制一个乱七八糟的链表)
S1(Mine): 用递归,指向什么,就新生成一个node,让这个node等于递归当前点指向的东西
         用hash记录节点地址是否出现过。
newNode->label=head->label;
        if (head->next!=NULL) newNode->next=copyRandomList(head->next);
        if (head->random!=NULL) newNode->random=copyRandomList(head->random);


加法
2. Add Two Numbers(用链表表示的两个数,把它们相加)
S1(Mine): 直接遍历相加,注意进位


删除元素
19. Remove Nth Node From End of List(从一个链表的末尾删除n个数)
S1(Mine):模拟,计数
203. Remove Linked List Elements(删除值为val的所有元素)
S(Mine):模拟
237. Delete Node in a Linked List(删除指定元素)
S(Mine): 模拟


合并
21. Merge Two Sorted Lists(合并两个链表)
88. Merge Sorted Array(合并2个排好序的数组)
S:注意处理末尾的冗余
23. Merge k Sorted Lists(合并k个链表)
S(Discuss): 写一个专门合并两个链表的函数,每次合并两个,然后再放在里面再继续跟其他的合并。
转化成合并两个链表。


排序
148. Sort List(给单链表排序)
S(Mine): 暴力,很慢*5
S(Discuss): 归并排序
sortList函数:每次把链表均分左右部分,分别调用sortList(left)和sortList(right),在merge(left,right)
总之:递归拆分,然后merge
147. Insertion Sort List(用插入排序排链表)
S1(Mine): 朴素
S2(Discuss): 新建一个INT_MIN的结点作表头,插入排序,最后返回head->next即可。
用一个INT_MIN真的省了好多事。


换位置 反序 指定换位规则
24. Swap Nodes in Pairs(两两交换位置)
S:模拟
25. Reverse Nodes in k-Group(每k个一组,反序)
S1(Mine): 用vector记录,当到k个时,放在链表里,cnt清零,vector清零。
61. Rotate List(旋转一个链表)
S1(Mine): 模拟
206. Reverse Linked List(反转一个链表)
92. Reverse Linked List II(从m到n反转一个链表)
朴素模拟
86. Partition List(比x小的放在左边,大的放右边)
S1(Mine):开两个链表大和小,最后再连起来。
S2(Discuss):比我的code简洁
143. Reorder List(一个链表,分成两半,一个正序一个反序,交叉相连)
S1(Mine): vector<ListNode*> re;按照顺序放进去,根据下标方便访问,然后反序交叉
S2(Discuss): 三步:找到中点,右边反序,合并
328. Odd Even Linked List(奇数编号放前面,偶数编号放后面)
S(Mine):用flag标记是奇数还是偶数,放在对应的两个lists里面,再合并两个lists

环,找交点
141. Linked List Cycle(判断链表是否有环)
S1(Mine):两个pointers,一个快,一个慢,若相遇则有环
142. Linked List Cycle II(找到一个环的开始)
S:两个pointers,一个快,一个慢,然后根据一堆等式,找相遇点,开始点。
160. Intersection of Two Linked Lists(找到两个Lists的交点)
S1(Mine): 遍历两个lists并计数,如果最后一个结点相同则相交;然后根据计数数个数看交点是哪个。
S(Discuss): 非常天才的想法,详见这道题的.cpp文件,有思路。
用两个指针分别指向l1和l2,当其中一个到达尾部的时候,就指向另一个list的头部,继续,直到两个指针相遇。
1. 当不想交时候,会在NULL相遇。
2. 当相交的时候,会在交点相遇。


check满足某种要求
234. Palindrome Linked List(判断List是否回文)
S1(Mine): 分成两半,反序右边,逐一对比
0 0
原创粉丝点击