力扣面试150题--环形链表和两数相加
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;}
}