Day 1.17
(一)环形链表Ⅱ
题目
代码
public class Solution {
public ListNode detectCycle(ListNode head) {
ListNode[] listNode = new ListNode[10000];
int count = 0;
while (head != null) {
for(int i = 0;i<=count;i++){
if(listNode[i] == head)
return head;
}
listNode[count] = head;
head = head.next;
count++;
}
return null;
}
}
结果
(二)两数相加
题目
思路(1)
将l1
和l2
转化成数,相加后再将和转化成链表,发现超出整型范围
思路(2)
将l1
和l2
每位相加,加和对10取余为新节点值,加和除以10为进位
代码
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode listNode = new ListNode(0);
ListNode head = listNode;
int p = 0;
while(l1 != null || l2 != null) {
int x = 0;int y = 0;
if(l1 != null) {
x = l1.val;
}
if(l2 != null) {
y = l2.val;
}
int sum = x + y + p;
p = sum / 10;
sum = sum % 10;
head.next = new ListNode(sum);
head = head.next;
if(l1 != null)
l1 = l1.next;
if(l2 != null)
l2 = l2.next;
}
if (p > 0) head.next = new ListNode(p);
return listNode.next;
}
}
结果
笔记
- 两个数同步从低位往高位遍历,while循环结束条件是两个数都遍历结束
while (l1 != null || l2 != null)
- 设置进位
carry
,初始值为0
- 每次遍历的时候都使用三元表达式提取出两个数当前要相加的位
int n1 = l1 != null ? l1.val : 0;
- 取出当前要相加的位的数字
n1
和n2
,计算sum = n1 + n2 + carry
- 更新
carry = sum / 10
, 而这一轮相加的结果个位就是sum % 10
- 最后
if (carry > 0)
,判断最后还有进位的情况,比如1 + 99 = 100