Day 32
题目描述
思路
采取快慢指针
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public boolean hasCycle(ListNode head) {
ListNode fast = head;
ListNode slow = head;
// 空链表、单节点链表一定不会有环
while (fast != null && fast.next != null) {
fast = fast.next.next; // 快指针,一次移动两步
slow = slow.next; // 慢指针,一次移动一步
if (fast == slow) { // 快慢指针相遇,表明有环
return true;
}
}
return false; // 正常走到链表末尾,表明没有环
}
}
题目描述
思路
由于l1和l2是倒序排列的,也就是从低位到高位,那么直接按照顺序相加,记录进位,如果l1和l2其中一个加到尾部了,另外一个加0和进位即可,最后返回结果
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode res=new ListNode();
ListNode head=res;
int num=0;//模拟进位
while(l1!=null&&l2!=null){
int x=l1.val+l2.val+num;
if(x>=10){
num=1;
res.next=new ListNode(x%10);
res=res.next;
}
else{
num=0;
res.next=new ListNode(x);
res=res.next;
}
l1=l1.next;
l2=l2.next;
}
if(l1==null){
while(l2!=null){
int x=num+l2.val;
if(x>=10){
num=1;
res.next=new ListNode(x%10);
res=res.next;
}
else{
num=0;
res.next=new ListNode(x);
res=res.next;
}
l2=l2.next;
}
}
else{
while(l1!=null){
int x=num+l1.val;
if(x>=10){
num=1;
res.next=new ListNode(x%10);
res=res.next;
}
else{
num=0;
res.next=new ListNode(x);
res=res.next;
}
l1=l1.next;
}
}
if(num==1)
{
res.next=new ListNode(1);
res=res.next;
}
return head.next;
}
}