程序员面试金典2.1-2.5

程序员面试金典2.1

在这里插入图片描述

1.用Set

class Solution {
    public ListNode removeDuplicateNodes(ListNode head) {
        if(head==null) return null;
        HashSet <Integer>set1=new HashSet<>();
        ListNode node1=head;
        set1.add(node1.val);
        while(node1.next!=null){
            ListNode node2=node1.next;
            if(!set1.add(node2.val)){
                node1.next=node1.next.next;
            }
            else{
                node1=node1.next;
            }
        }
        node1.next=null;
        return head;


    }
}

2.用二重循环

class Solution {
    public ListNode removeDuplicateNodes(ListNode head) {
        if(head==null) return null;
        ListNode node1=head;
        while(node1!=null){
            ListNode node2=node1;
            while(node2.next!=null){
                if(node2.next.val==node1.val) node2.next=node2.next.next;
                else node2=node2.next;
            }
            node1=node1.next;    
        }
        return head;
    }
}

一个是关于忘记最后的node1=node1.next导致超时
一个是关于node1!=null还是node1.next!=null的争论
好像判断准则是不能出现null.next

2.2倒数第k个值

在这里插入图片描述

class Solution {
    public int kthToLast(ListNode head, int k) {
        ListNode node1=head;
        ListNode node2=head;
        for(int i=0;i<k-1;i++) node2=node2.next;
        while(node2.next!=null){
            node2=node2.next;
            node1=node1.next;
        }
        return node1.val;

    }
}

经典双指针,不赘述。数据结构课的练习题

2.3删除中间节点

在这里插入图片描述

class Solution {
    public void deleteNode(ListNode node) {
        node.val=node.next.val;
        node.next=node.next.next; 
    }
}

数据结构课上练习,再次见还愣了一下,不再赘述

2.4分割链表

在这里插入图片描述
我想用双指针去做,但是写的判断为null的条件太多了,原代码如下:

class Solution {
    public ListNode partition(ListNode head, int x) {
        ListNode node1=head;
        while(node1!=null){
            while(node1.val<x){
                node1=node1.next;
                if(node1==null) break;
            }
            if(node1==null) break;
            ListNode node2=node1.next;
            if(node2==null)break;
            while(node2.val>=x){
                node2=node2.next;
                if(node2==null) break;
            }
            if(node2==null)break;
            int temp=node1.val;
            node1.val=node2.val;
            node2.val=temp;

        }
        return head;
    }
}

2.5链表求和(*)

在这里插入图片描述

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        int carry=0; //进位
        ListNode head=new ListNode(-1);//虚拟头结点,便于答案返回
        ListNode node1=head;
        while(l1!=null || l2!=null ||carry!=0){
            int sum=carry;
            if(l1!=null){
                sum+=l1.val;
                l1=l1.next;
            }
            if(l2!=null){
                sum+=l2.val;
                l2=l2.next;
            }
            node1.next=new ListNode(sum%10);
            node1=node1.next;
            carry=sum/10;
        }
        return head.next;
    }
}

就是一位一位的进行处理,注意进位符号carry的处理。
sum=l1.val+l2.val+carry
l1和l2要注意是否为空
node1.next=new ListNode(sum%10);从确立新节点的时候,用node1.next;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值