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;
    }
}
原文地址:https://www.cnblogs.com/kong-xy/p/9034474.html