最近摸鱼有点多,今天的题目加班做完,希望接下来每天完成小目标!!
2. 两数相加https://leetcode-cn.com/problems/add-two-numbers/
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
想法:
- 题目思路很像之前做的字符串相加那道题,保留进位,然后判断两个加数的值,再三数之和,求余是当前值,除10是进位值;
- 刚开始对l1和l2两个节点如果null的情况处理的不够好,想着去为空就去创建一个节点且值为0,但是这样很麻烦,而且很浪费空间,所以只要为空,就不让当前这个结点指针next下去,让它呆在原地;
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode ans = new ListNode(0);
ListNode cur = ans;
int add=0;//保留进位;
while( l1!=null || l2!=null|| add!=0){
int num1 = (l1!=null? l1.val : 0);
int num2 = (l2!=null? l2.val : 0);
int cur_sum = num1+num2+add;//当前三数之和;
//创建一个新的节点,让流动节点cur顺下去
ListNode cur_Node = new ListNode(cur_sum%10);
cur.next = cur_Node;
cur = cur_Node;
add = cur_sum/10;
//如果l1或者l2当前节点为空,就不让它顺下去
if(l1!=null)l1=l1.next;
if(l2!=null)l2=l2.next;
}
return ans.next;
}
}
142. 环形链表 IIhttps://leetcode-cn.com/problems/linked-list-cycle-ii/
这道题leetcode上的题目意思没看懂,不过以前遇到过,用大白话说就是
“判断一个链表是否有环,如果有,找到换的入口点返回,否则就null”
大概就这个意思!
想法:
- 这道题直接记结论感觉好点,就是快慢指针相遇的节点为相遇点,然后头节点和相遇点同步移动,再相遇就是环的入口点!
public class Solution {
public ListNode detectCycle(ListNode head) {
ListNode slow = head,fast= head; //设置快慢指针
while(fast!=null && fast.next!=null){
slow=slow.next;
fast = fast.next.next;
if(slow==fast)
break;
}
if(fast==null || fast.next==null) //没有环,就null
return null;
fast=head; //fast再利用,指向开始点;
while(fast!=slow){ //
fast = fast.next;
slow = slow.next;
}
return fast; //返回入口点
}
}