【LeetCode刷题笔记】剑指offer系列(一)

106 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第30天,点击查看活动详情 这也是第35篇文章

链表中的两数相加

题目

给定两个 非空链表 l1和 l2 来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。

可以假设除了数字 0 外,这两个数字都不会以零开头。

思路

将两个链表中的加数的每一位分别入栈,之后每次都记录当前相加结果(值为cur,结点为tmp)以及进位(carry),然后将结果链表相连(tmp.next=cur;res=tmp;)

代码

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        Deque<Integer> s1=new ArrayDeque<>();
        Deque<Integer> s2=new ArrayDeque<>();
        ListNode n1=l1;
        ListNode n2=l2;
        ListNode res=null;
        while(n1!=null){
            s1.push(n1.val);
            n1=n1.next;
        }
        while(n2!=null){
            s2.push(n2.val);
            n2=n2.next;
        }
        int carry=0;
        while(!s1.isEmpty()||!s2.isEmpty()||carry!=0){
            int num1=s1.isEmpty()?0:s1.pop();
            int num2=s2.isEmpty()?0:s2.pop();
            int cur=num1+num2+carry;
            carry=cur/10;
            cur=cur%10;
            ListNode tmp=new ListNode(cur);
            tmp.next=res;
            res=tmp;
        }
        return res;
    }
}

链表中环的入口结点

题目

给定一个链表,返回链表开始入环的第一个节点。 从链表的头节点开始沿着 next 指针进入环的第一个节点为环的入口节点。如果链表无环,则返回 null

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。

说明: 不允许修改给定的链表。

思路

找出被重复遍历的结点就返回。

而查重可以利用set的特性,它不含重复元素,且可以用它的contains()方法。

代码

public class Solution {
    public ListNode detectCycle(ListNode head) {
        HashSet<ListNode> set=new HashSet<>();
        ListNode node=head;
        while(node!=null){
            if(set.contains(node)) return node;
            else{
                set.add(node);
            }
            node=node.next;
        }
        return null;
    }
}

写在文末的碎碎念

今天一天都在重做6.s081中之前做过的内容,但是之前已经写过文章了,所以这块内容不能再写。但是又给自己定了硬性指标,每天都要有东西写,没办法,就回顾一下这几天做的几道题吧。