• 5.13-Linked List


    86. Partition List

    基本思路:crate lefthead, lefttail, righthead, righttail指针 遍历一遍整个list, 对每一个element做一个大小的判断,小于given value计入left, 大于等于given value的计入righthead, 最后leftail与righthead相连,并return lefthead作为合并后的链表head.
    Q: 每次都要create 新节点?还是直接将原有节点重新排序?
    A: 直接重新排序即可
    Q: leftHead 与 rightHead 只需要更新一次,而leftTail 与 rightTail需要更新多次,如何分别更新。
    A: if (leftHead == null) leftHead = curr;
    时间复杂度: O(n)
    空间复杂度: O(n)

    dummy node 是为了解决headnode 与 currnode 指针更新不同步
    如果使用了dummy node
    dummy node 的声明

    //Create a new ListNode instance
    ListNode dummyLeft = new ListNode(0);
    left = dummyLeft;
    //update value
    left.next = head;
    left = left.next;
    
    while (head != null) {
        if (leftHead == null) {
            leftHead = head;
        } else {
            leftTail = head,
            leftTail = leftTail.next;
        }
    }
    
    while (head != null) {
        left = head;
        left = left.next;
    }
    

    Runtime error:

    1. NullPointerException: dummy node 声明错误
    2. Memory Limit Exceeded: 没有添加 right.next = null 没有将linkedlist 闭合

    83. Remove Duplicates from Sorted List

    基本思路:一次遍历,一个pointer固定第一次出现的value, 一个pointer依次序继续向下遍历,若value相等,表示有重复元素,delete,直到遍历到第一个不相同的元素或null节点,否则,直接进行两个Pointer节点的更新。

    时间复杂度:O(n)
    空间复杂度:O(1)
    TimeLimitError: read data from a Null pointer, infinite while loop

    1. Add Two Numbers
      题目: 给出两个链表,分别表示两个倒序的数字, 例如(1 -> 2 -> 4) 表示 421, 写一个function能够将这两个链表表示的数字相加求和, 并返回最后求和得到的sum(同样用链表表示)。
      基本思路:
      两个pointer分别指向两个需要相加的数字,依次相加,如果当前数位的和没超过10,则直接保留,若超过10,则将进位加一,余位减10。
      逐位相加, 3 个while loop

    Corner Case: [5] + [5] = [0, 1]

    class Solution {
        public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
            int carry = 0;
            ListNode dummy = new ListNode(0);
            ListNode l3 = dummy;
            while(l1 != null && l2 != null) {
                int sum = l1.val + l2.val + carry;
                l3.next = new ListNode(sum % 10);
                carry = sum / 10;
                l1 = l1.next;
                l2 = l2.next;
                l3 = l3.next;
            }
            
            while (l1 != null) {
                int sum = l1.val + carry;
                l3.next = new ListNode(sum % 10);
                carry = sum / 10;
                l1 = l1.next;
                l3 = l3.next;
            }
            
            while (l2 != null) {
                int sum = l2.val + carry;
                l3.next = new ListNode(sum % 10);
                carry = sum / 10;
                l2 = l2.next;
                l3 = l3.next;
            }
    
            if (carry != 0) {
                l3.next = new ListNode(carry);
            }
            return dummy.next;
        }
    }
    
  • 相关阅读:
    HDU6256 Master of Phi (狄利克雷卷积、欧拉函数)
    POJ2689 Prime Distance
    演练5-4:Contoso大学校园管理系统4
    Week7(10月24日)
    演练5-3:Contoso大学校园管理系统3
    Week7(10月21日)
    演练5-2:Contoso大学校园管理2
    Week6(10月17日):周末别忘记运动
    演练5-1:Contoso大学校园管理1
    Week6(10月14日)
  • 原文地址:https://www.cnblogs.com/kong-xy/p/9034474.html
Copyright © 2020-2023  润新知