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:
- NullPointerException: dummy node 声明错误
- 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
- 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;
}
}