LinkedList
list.get(index)//O(N)
list.size()//O(1)
➤ Dummy Node
巧用一个dummy node的next 来locate一个关键的。比如说,
- tree track the start of the level above current level
» 117. Populating Next Right Pointers in Each Node II F家微软
http://rainykat.blogspot.com/2017/02/leetcode-33-search-in-rotated-sorted.html
➤ Two Pointer
两个pointer
* 1.slow,slow = slow.next正常loop + 2.fast , fast = fast.next.next 每次走快一步
Ex: find Middle
while(fast != end && fast.next != end){ ...;} slow is middle
» 109. Convert Sorted List to Binary Search Tree(dfs) Zenefit
http://rainykat.blogspot.com/2017/01/leetcodeairbnb-108-convert-sorted-array.html
» 143. Reorder List
http://rainykat.blogspot.com/2017/03/leetcode-143-reorder-listlinkedlist.html
Ex:查cycle
» 234. Palindrome Linked List F家A家
-- fast/slow ptr to find the half of the list(也用于 148.merge sort,在下面 )
http://rainykat.blogspot.com/2017/01/leetcodefa-234-palindrome-linked.html
* 1.正常loop, 2 focus关键位置
» 147. Insertion Sort List 各大家
http://rainykat.blogspot.com/2017/03/leetcode-147-insertion-sort-list.html
*2 pointer update while looping 1 pointer focus关键位置(evenlist的start)
» 328. Odd Even Linked List 高频
http://rainykat.blogspot.com/2017/04/leetcode-328-odd-even-linked-list.html
2.partition
Ex:用merge sort来sort list ,巧用2个链表
3.用stack存倒序读数
Ex:
add two number, palindrome
https://leetcode.com/problems/add-two-numbers-ii/
➤ 普通iteration
» 61. Rotate List
http://rainykat.blogspot.com/2017/05/leetcode-61-rotate-listlinkedlist.html
➤ Recursive 解法
» 83.82.Remove Duplicates from Sorted List I/II
http://rainykat.blogspot.com/2017/03/8384remove-duplicates-from-sorted-list.html
» 83. Remove Duplicates from Sorted List
head.next接的是下一没有duplicates的list
public ListNode deleteDuplicates(ListNode head) {
if(head == null || head.next == null)return head;
ListNode nextN = head.next;
head.next = deleteDuplicates(head.next);
//[0,1,1,2,5] head: 2,1,1,0 vs nextN: 5,2,1,1 -- this way from end to start
if(nextN.val == head.val){//skip dup
head.next = nextN.next;
nextN = nextN.next;
}
return head;
}
Loop/Iterative List 题集
» 160. Intersection of Two Linked Lists 各大家
到两个list长度相同的点开始走,找交叉点
http://rainykat.blogspot.com/2017/01/leetcode-160-intersection-of-two-linked.html
» 369. Plus One Linked List(two pointer) G家
http://rainykat.blogspot.com.tr/2017/01/leetcodeg-369-plus-one-linked-listtwo.html
» 92. Reverse Linked List II (Iteration)
http://rainykat.blogspot.com/2017/01/leetcodef-92-reverse-linked-list-ii.html
Recursion -- O(n) time for n depth, O(n) space for stack
» 22. Merge Two Sorted List(can also iterative) Amazon LinkedIn Apple Microsoft
https://leetcode.com/problems/merge-two-sorted-lists/
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1==null)return l2;
if(l2==null)return l1;
if(l1.val<l2.val){
l1.next = mergeTwoLists(l1.next,l2);//l1小就取l1,接着merge l2和l1之后的
return l1;
}else{
l2.next = mergeTwoLists(l1,l2.next);
return l2;
}
}
» 148. Sort List(上题+merge sort)
http://rainykat.blogspot.com.tr/2017/01/leetcode-148-sort-list-mergesort.html
» 24. Swap Nodes in Pairs 微软 Bloomberg Uber
https://leetcode.com/problems/swap-nodes-in-pairs/
public class Solution {
public ListNode swapPairs(ListNode head) {
if(head==null||head.next==null)return head;
ListNode nextN = head.next;
head.next = swapPairs(nextN.next);
nextN.next = head;
return nextN;
}
}
» 83. Remove duplates in LinkedList
Link:
https://leetcode.com/problems/remove-duplicates-from-sorted-list/
public class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head == null || head.next == null){ return head;}
head.next = deleteDuplicates(head.next);
if(head.val==head.next.val){
head=head.next;//means skip one node
}
return head;
}
}
//sample output
3&3
*
2&3
1&2
1&1
*
» 203.Remove Linked List Elements - 类似上题
https://leetcode.com/problems/remove-linked-list-elements/
public class Solution {
public ListNode removeElements(ListNode head, int val) {
if(head==null){return head;}//base case different,list can be empty
head.next = removeElements(head.next,val);//head.next from last num to 1st
if(head.val == val){
head = head.next;
}
return head;
}
}
» 206. Reverse LinkedList 各大家的基础题
https://leetcode.com/problems/reverse-linked-list/
Recurrsion
每次回溯把nextnode连到head,head连到null
public class Solution {
public ListNode reverseList(ListNode head) {
if (head==null||head.next==null){return head;}
ListNode nextnode = head.next;
ListNode newhead = reverseList(head.next);//last node in list
nextnode.next=head;
head.next= null;
return newhead;
}
}
Iterative:
注意最后是在head=null,所以返回prev(即newhead)
public class Solution {
public ListNode reverseList(ListNode head) {
if(head==null||head.next==null){ return head;}
ListNode prev = null;
while(head!=null){
ListNode next = head.next;
head.next = prev;
prev = head;
head = next;
}
return prev;//prev is newhead, head is null
}
}