Leetcode刷题笔记—List (20)

 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);
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值