zoukankan      html  css  js  c++  java
  • 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;
        }
    }
    
  • 相关阅读:
    一个十分诡异的NullReferenceException异常!
    如何去掉TabControl控件默认添加的TabPage
    GDI+发生一般性错误的解决方法
    C#中各种数组的性能比较
    酷享娱乐新生活
    关于ImageList.Images集合的特殊行为!
    WinForm窗体之间交互的一些方法
    实现单实例应用程序的三种方案
    MySql_Close 释放资源
    数组之List
  • 原文地址:https://www.cnblogs.com/kong-xy/p/9034474.html
Copyright © 2011-2022 走看看