430. Flatten a Multilevel Doubly Linked List

class Solution {
public Node flatten(Node head) {
if(head == null) {
return head;
} // base case 必须写 不然cur.prev = pre 会报空指针异常
Node dummy = new Node(0);
Node pre = dummy;
Stack<Node> stack = new Stack();
stack.push(head);
while(!stack.isEmpty()) {
// 逻辑在这里实现,
Node cur = stack.pop();
cur.prev = pre;
pre.next = cur;
// 下一个node先入栈,child节点再入栈
if(cur.next != null) {
stack.push(cur.next);
}
if(cur.child != null) {
stack.push(cur.child);
cur.child = null; // child入栈后,cur就没有child
}
pre = cur;
}
dummy.next.prev = null; //第一个node的prev指向null,而不是dummy.prev = null
return dummy.next;
}
}
237. Delete Node in a Linked List


class Solution {
public void deleteNode(ListNode node) {
if(node != null && node.next != null) {
// 将node的值设置成下一个node的值,整条链表中删除下一个node就行,
//因为node替换成下一个node的值相当于node的值已经不存在
node.val = node.next.val;
node.next = node.next.next;
}
}
}
328. Odd Even Linked List

class Solution {
public ListNode oddEvenList(ListNode head) {
// base case 必须写不然就会 head.next null 错误
if(head == null || head.next == null) {
return head;
}
ListNode odd = head; // odd poniter
ListNode even = head.next; // even pointer
ListNode evenHead = even; //pointer 指向evenlist的头部
while(even != null && even.next != null) {
odd.next = odd.next.next;
odd = odd.next;
even.next = even.next.next;
even = even.next;
}
odd.next = evenHead;
return head;
}
}
86. Partition List

class Solution {
public ListNode partition(ListNode head, int x) {
ListNode lessDummy = new ListNode(0);
ListNode cur1 = lessDummy;
ListNode moreDummy = new ListNode(0);
ListNode cur2 = moreDummy;
while(head != null) {
if(head.val < x) {
cur1.next = head;
cur1 =cur1.next;
} else {
cur2.next = head;
cur2 = cur2.next;
}
head = head.next;
}
cur1.next = moreDummy.next;
cur2.next = null; //要指向null 不然是环cycle
return lessDummy.next;
}
}
147. Insertion Sort List

class Solution {
public ListNode insertionSortList(ListNode head) {
ListNode dummy = new ListNode(0);
ListNode cur = head;
ListNode next = null;
while(cur != null) {
next = cur.next;
ListNode pre = dummy;
while(pre.next != null && pre.next.val <= cur.val) {
pre = pre.next;
}
cur.next = pre.next;
pre.next = cur;
cur = next;
}
return dummy.next;
}
}
725. Split Linked List in Parts

class Solution {
public ListNode[] splitListToParts(ListNode head, int k) {
ListNode[] ans = new ListNode[k];// 划分成k部分
int len = 0;
ListNode root = head; //需要使用pointer,不然后续head本身的值会变化
while(root != null) {
len++; // 计算list的总长度
root = root.next;
}
int num = len / k, leftNum = len % k; // k个部分,每个部分len/k,余数leftNum则平摊到前leftNum个list中
ListNode pre = null; //定义一个pre指针方便后面断开list
root = head; // root重新复原到root
for(int i = 0; root != null && i < k; i++) { //i是小于k,因为数组有k个
ans[i] = root;
//每个数组是listNode,计算ListNode的长度
for(int j = 0; j < num + (leftNum > 0 ? 1 : 0); j++) {
pre = root;
root = root.next;
}
leftNum--; //一个数组也就是一个部分,一个部分走完后,leftNum➖1
if(pre != null) {
// 走到这里pre该断开,如果判断不为null,则断开
pre.next = null;
}
}
return ans;
}
}
1171. Remove Zero Sum Consecutive Nodes from Linked List

class Solution {
public ListNode removeZeroSumSublists(ListNode head) {
ListNode dummy = new ListNode(0);
dummy.next = head;
HashMap<Integer, ListNode> map = new HashMap();
int sum = 0;
map.put(0, dummy); // this line can be deleted
for(ListNode cur = dummy; cur != null; cur = cur.next) {
sum += cur.val;
map.put(sum, cur);
}
sum = 0;
for(ListNode cur = dummy; cur != null; cur = cur.next) {
sum += cur.val;
cur.next = map.get(sum).next;
}
return dummy.next;
}
}
class Solution {
public ListNode removeZeroSumSublists(ListNode head) {
ListNode dummy = new ListNode(0);
dummy.next = head;
HashMap<Integer, ListNode> map = new HashMap();
int sum = 0;
map.put(0, dummy);
ListNode cur = dummy;
while(cur !=null) {
sum += cur.val;
map.put(sum, cur);
cur = cur.next;
}
sum = 0;
cur = dummy;
while(cur != null) {
sum += cur.val;
cur.next = map.get(sum).next;
cur = cur.next; // 忘记写了就超时
}
return dummy.next;
}
}
817. Linked List Components

class Solution {
public int numComponents(ListNode head, int[] nums) {
HashSet<Integer> set = new HashSet(); // convert to set because set has contains method
for(int num : nums) {
set.add(num);
}
int component = 0, connect = 0;
ListNode temp = head;
while(temp != null) { //判断节点node是否出现在 set中,出现connect➕1
if(set.contains(temp.val)) {
connect += 1;
} else if( connect > 0){
// 当某个节点不出现时 判断此时connect是否大于0, 大于说明这个节点前面有component,然后讲connect重制为0
component +=1;
connect = 0;
}
temp = temp.next;
}
if(connect == 0) {
//刚好等于0 说明刚好走完set
return component;
} // 否则说明set没有走完此时component➕1
return component + 1;
}
}
1019. Next Greater Node In Linked List

class Solution {
public int[] nextLargerNodes(ListNode head) {
// convert linkedlist to arraylist
List<Integer> list = new ArrayList();
while(head != null) {
list.add(head.val);
head = head.next;
}
int[] ans = new int[list.size()];
Stack<Integer> stack = new Stack();
for(int i = 0; i < list.size(); i++) {
// when current element is bigger than previous one
while(!stack.isEmpty() && list.get(i) > list.get(stack.peek())) {
ans[stack.pop()] = list.get(i);
}
// when current element smaller than prevoious element
stack.push(i);
}
return ans;
}
}
148. Sort List

class Solution {
public ListNode sortList(ListNode head) {
if(head == null || head.next == null) {
return head;
}
// cut the list to two halves
ListNode pre = null;
ListNode slow = head;
ListNode fast = head;
while(fast != null && fast.next != null) {
pre = slow;
slow = slow.next;
fast = fast.next.next;
}
// pre right is the middle node
pre.next = null;
// sort the each half
ListNode l1 = sortList(head);
ListNode l2 = sortList(slow);
// merger l1 l2
return merge(l1, l2);
}
public ListNode merge(ListNode l1, ListNode l2) {
ListNode head = new ListNode(0);
ListNode dump = head;
while(l1 != null & l2 != null) {
if(l1.val < l2.val) {
dump.next = l1;
l1 = l1.next;
} else {
dump.next = l2;
l2 = l2.next;
}
dump = dump.next;
}
if(l1 != null) {
dump.next = l1;
}
if(l2 != null) {
dump.next = l2;
}
return head.next;
}
}
61.Rotate List

class Solution {
public ListNode rotateRight(ListNode head, int k) {
if(head == null) {
return null;
}
ListNode cur = head;
int len = 1;
while(cur.next != null) {
cur = cur.next;
len++;
}
cur.next = head;// circle list
for(int i = 0; i < (len - k % len); i++ ) {
cur = cur.next;
}
head = cur.next;
cur.next = null;
return head;
}
}
203. Remove Linked List Elements

class Solution {
public ListNode removeElements(ListNode head, int val) {
ListNode ff = new ListNode(-1);
ff.next = head;
ListNode cur = ff;
while(cur.next != null) {
if(cur.next.val == val) {
cur.next = cur.next.next;
} else {
cur = cur.next;
}
}
return ff.next;
}
}
206. Reverse Linked List

class Solution {
public ListNode reverseList(ListNode head) {
ListNode cur = head;
ListNode pre = null;
while(cur != null) {
ListNode temp = cur.next;
cur.next = pre;
pre = cur;
cur = temp;
}
return pre;
}
}
21. Merge Two Sorted Lists

class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
ListNode fake = new ListNode(), cur = fake;
while(list1 != null && list2 != null) {
if(list1.val <= list2.val) {
cur.next = list1;
list1 = list1.next;
} else {
cur.next = list2;
list2 = list2.next;
}
cur = cur.next;
}
cur.next = list1 == null ? list2 : list1;
return fake.next;
}
}
92. Reverse Linked List II

class Solution {
public ListNode reverseBetween(ListNode head, int left, int right) {
ListNode fake = new ListNode(0);
fake.next = head;
ListNode p = fake;
//断开后面节点 the start index of list here is 1 index
for(int i = 0; i < right; i++)
p = p.next;
ListNode last = p.next;
p.next = null;
//断开前面节点,要从前面断开,所以left-1
p = fake;
for(int i = 0; i < left - 1; i++) {
p = p.next;
ListNode b = p.next;
p.next = null;
b = reverseLinkedList(b);
}
p = fake;
while(p.next != null)
p = p.next;
p.next = b;
while(p.next != null)
p = p.next;
p.next = last;
return fake.next;
}
ListNode reverseLinkedList(ListNode head) {
ListNode cur = head;
ListNode pre = null;
while(cur != null) {
ListNode next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
return pre;
}
}
19. Remove Nth Node From End of List

class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode fake = new ListNode();
fake.next = head;
ListNode slow = fake, fast = fake;
for(int i = 1; i <= n; i++) {
fast = fast.next;
}
while(fast.next != null) {
slow = slow.next;
fast = fast.next;
}
slow.next = slow.next.next;
return fake.next;
}
}
24. Swap Nodes in Pairs

class Solution {
public ListNode swapPairs(ListNode head) {
ListNode fake = new ListNode(0);
fake.next = head;
ListNode pre = fake;
ListNode cur = head;
while(cur != null && cur.next != null) {
ListNode next = cur.next;
pre.next = next;
cur.next = next.next;
next.next = cur;
pre = cur;
cur = cur.next;
}
return fake.next;
}
}
138. Copy List with Random Pointer

class Solution {
public Node copyRandomList(Node head) {
Map<Node, Node> map = new HashMap();
Node cur = head;
while(cur != null) {
Node temp = new Node(cur.val);
map.put(cur, temp);
cur = cur.next;
}
cur = head;
while(cur != null) {
Node temp = map.get(cur);
temp.next = map.get(cur.next);
temp.random = map.get(cur.random);
cur = cur.next;
}
return map.get(head);
}
}
2. Add Two Numbers

class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dum = new ListNode(0);
ListNode cur = dum;
int carry = 0;
while(l1 != null || l2 != null || carry == 1) {
int sum = 0;
if(l1 != null) {
sum += l1.val;
l1 = l1.next;
}
if(l2 != null) {
sum += l2.val;
l2 = l2.next;
}
sum += carry;
carry = sum / 10;
ListNode node = new ListNode(sum % 10);
cur.next = node;
cur = cur.next;
}
return dum.next;
}
}
445. Add Two Numbers II

class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
l1 = reverseList(l1);
l2 = reverseList(l2);
ListNode head = addTwoNumbers2(l1, l2);
head = reverseList(head);
return head;
}
public ListNode addTwoNumbers2(ListNode l1, ListNode l2) {
ListNode dum = new ListNode(-1);
ListNode temp = dum;
int sum = 0, carry = 0;
while(l1 != null || l2 != null) {
sum += ((l1 != null) ? l1.val : 0) + ((l2 != null) ? l2.val : 0);
carry = sum / 10;
if(carry != 0) {
temp.next = new ListNode(sum % 10);
sum /= 10;
} else {
temp.next = new ListNode(sum);
sum = 0;
}
if(l1 != null) l1 = l1.next;
if(l2 != null) l2 = l2.next;
temp = temp.next;
}
if(sum != 0) temp.next = new ListNode(sum);
return dum.next;
}
public ListNode reverseList(ListNode head) {
if(head == null || head.next == null) return head;
return helper(head, null);
}
ListNode helper(ListNode head, ListNode newHead) {
if(head == null) return newHead;
ListNode next = head.next;
head.next = newHead;
return helper(next, head);
}
}