春招冲刺百题计划|链表

Java基础复习

  1. Java数组的声明与初始化
  2. Java ArrayList
  3. Java HashMap
  4. Java String 类
  5. Java LinkedList
  6. Java Deque继承LinkedList
  7. Java Set
  8. Java 队列
  9. 优先队列!!!
  10. Java数组划分
  11. Java数组转ArrayList
  12. String 转数字
  13. String

第一题:2. 两数相加

在这里插入图片描述
还是比较简单的一题

/**
 * 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) {
        int k=0;
        ListNode tmp = new ListNode();
        ListNode res = tmp;
        int last = 0;
        while(l1!=null&&l2!=null){
            tmp.next = new ListNode((l1.val+l2.val + last)%10);
            last = (l1.val+l2.val+last)/10;
            tmp = tmp.next;
            l1 = l1.next;
            l2 = l2.next;
        }
        while(l1!=null){
            tmp.next = new ListNode((l1.val+last)%10);
            last = (l1.val+last)/10;
            tmp = tmp.next;
            l1 = l1.next;
        }
        while(l2!=null){
            tmp.next = new ListNode((l2.val+last)%10);
            last = (l2.val+last)/10;
            tmp = tmp.next;
            l2 = l2.next;
        }
        while(last!=0){
            tmp.next = new ListNode(last%10);
            last = last/10;
            tmp = tmp.next;
        }
        return res.next;


    }
}

第二题:61. 旋转链表

在这里插入图片描述
首先就是很麻烦的想法。

/**
 * 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 rotateRight(ListNode head, int k) {
        if(head==null){
            return head;
        }
        //最简单,拿一个数组来存储val,然后
        List<Integer> list = new ArrayList<Integer>();
        ListNode newHead = new ListNode(head.val, head.next);
        while(newHead!=null){
            list.add(newHead.val);
            newHead = newHead.next;
        }
        k = k%list.size();
        List<Integer> list2 = new ArrayList<Integer>(list.size());
        for(int i=0; i<list.size(); i++){
           list2.add(list.get((i-k+list.size())%list.size()));
        }
        System.out.print(list2);
        ListNode tmp = new ListNode();
        ListNode res = tmp;
        for(int i=0; i<list.size(); i++){
           tmp.next = new ListNode(list2.get(i));
           tmp = tmp.next;
        }
        return res.next;
    }
}

官方解法:

/**
 * 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 rotateRight(ListNode head, int k) {
        if (k == 0 || head == null || head.next == null) {
            return head;
        }
        int n = 1;
        ListNode iter = head;
        while (iter.next != null) {
            iter = iter.next;
            n++;
        }
        int add = n - k % n;//找到断点处
        if (add == n) {
            return head;
        }
        iter.next = head; //成环
        while (add-- > 0) {
            iter = iter.next;
        }
        ListNode ret = iter.next;//新起点
        iter.next = null; //断开
        return ret;
    }
}

第三题:82. 删除排序链表中的重复元素 II

在这里插入图片描述
原来刷代码随想录的时候,遇到这种题目,可以添加一个空的头指针,方便统一处理。

/**
 * 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 deleteDuplicates(ListNode head) {
        while(head==null||head.next==null){
            return head;
        }
        ListNode newhead = new ListNode(-1, head);
        ListNode l = newhead, r=head.next;
        while(l!=null&&r!=null){
            if(l.next.val!=r.val){
                l=l.next;
                r=r.next;
            }else{
                while(r!=null&&r.val==l.next.val){
                    r = r.next;
                }
                l.next = r;
                if(r!=null)
                    r = r.next;
            }
            
        }
        return newhead.next;
    }
}

第四题:92. 反转链表 II

在这里插入图片描述

/**
 * 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 reverseBetween(ListNode head, int left, int right) {
        //原本想要尝试成环断开的方法,写完才发现,思路是错的。
        if(left==right){
            return head;
        }

        ListNode newHead = new ListNode(0, head);
        ListNode beforeLeft = newHead, afterRight = head;
        int i = 1;
        while(i<left){
            beforeLeft = beforeLeft.next;
            i++;
        }
        afterRight = beforeLeft;
        while(i<=right){
            afterRight = afterRight.next;
            i++;
        }
        ListNode l = beforeLeft.next, r = afterRight; //l和r是需要翻转的那一部分的头和尾。
        afterRight = afterRight.next; //无需翻转的后半部分
        i=1;
        while(l!=r){
            beforeLeft.next = r; // 1->4
            beforeLeft = beforeLeft.next; //1->4->?
            i++;
            r = l;//以下是找3的过程
            int j = 0;
            while(j<right-left+1-i){
                r = r.next;
                j++;
            }
        }
        beforeLeft.next = r; 
        beforeLeft = beforeLeft.next;
        beforeLeft.next = afterRight;
        return newHead.next;

    }
}

第五题:24. 两两交换链表中的节点

在这里插入图片描述

/**
 * 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 swapPairs(ListNode head) {
        if(head==null||head.next==null){
            return head;
        }
        ListNode newhead = new ListNode(0, head);
        ListNode l = newhead, r=head.next;
        while(r!=null){
            System.out.println(r.val);
            l.next.next = r.next;
            r.next = l.next;
            l.next = r;
            l = l.next.next;
            if(l.next==null){
                break;  
            }
            r = l.next.next;
        }
        return newhead.next;
        

    }
}

第六题:143. 重排链表

在这里插入图片描述
缝缝补补的代码:本质还是每次往后找最后一个节点,插入。所以就是查找,插入。需要好多的if来判断是不是null了。

/**
 * 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 void reorderList(ListNode head) {
        if(head==null||head.next==null){
            return;
        }
        ListNode newHead = new ListNode(0, head);
        ListNode iter = head, target = head;
        while(iter.next!=null){
            target = iter;
            if(target.next.next==null)
                break;
            while(target.next.next!=null){
                target = target.next;
            }
            System.out.println(target.next.val);
            target.next.next = iter.next;
            iter.next =  target.next;
            target.next = null;
            if(iter.next==null || iter.next.next==null){
                break;
            }
            iter = iter.next.next;
        }

        

    }
}

第七题:160. 相交链表

在这里插入图片描述
最暴力的思路,当然还是会思考能不能O(n)时间内解决。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode a = headA, b = headB;
        while(a!=null){
            b = headB;
            while(b!=null){
                if(a==b){
                    return a;
                }
                b = b.next;
            }
            a=a.next;
        }
        return null;
        
    }
}

有大神的解法:https://leetcode.cn/problems/intersection-of-two-linked-lists/solutions/10774/tu-jie-xiang-jiao-lian-biao-by-user7208t
挺难想到的。

复习指南:看灵茶山艾府的基础精讲对应的视频。(翻转+快慢指针)
重点复习重排链表:设计反转和找中心节点(快慢指针)

class Solution {
    public void reorderList(ListNode head) {
        ListNode mid = middleNode(head);
        ListNode head2 = reverseList(mid);
        while (head2.next != null) {
            ListNode nxt = head.next;
            ListNode nxt2 = head2.next;
            head.next = head2;
            head2.next = nxt;
            head = nxt;
            head2 = nxt2;
        }
    }

    // 876. 链表的中间结点
    private ListNode middleNode(ListNode head) {
        ListNode slow = head, fast = head;
        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
        }
        return slow;
    }

    // 206. 反转链表
    private ListNode reverseList(ListNode head) {
        ListNode pre = null, cur = head;
        while (cur != null) {
            ListNode nxt = cur.next;
            cur.next = pre;
            pre = cur;
            cur = nxt;
        }
        return pre;
    }
}

相关推荐

  1. 度机器学习算法一二三面面经

    2024-07-18 12:46:02       31 阅读
  2. 问题总结

    2024-07-18 12:46:02       44 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-18 12:46:02       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-18 12:46:02       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-18 12:46:02       58 阅读
  4. Python语言-面向对象

    2024-07-18 12:46:02       69 阅读

热门阅读

  1. Electron 应用关闭突出程序坞

    2024-07-18 12:46:02       19 阅读
  2. 数据可视化入门

    2024-07-18 12:46:02       26 阅读
  3. 用mybatis-plus-generator快速构建简单代码

    2024-07-18 12:46:02       22 阅读
  4. LinearLayout实现原理分析

    2024-07-18 12:46:02       21 阅读
  5. 存储ODS数据的时候为什么在Hive中建立Iceberg表

    2024-07-18 12:46:02       19 阅读
  6. 基于 Gunicorn、Flask 和 Docker 的高并发部署模型

    2024-07-18 12:46:02       21 阅读
  7. 残月之肃-C++

    2024-07-18 12:46:02       18 阅读
  8. 升本1.0.5-规划-英语-207天

    2024-07-18 12:46:02       22 阅读
  9. CmakeLists

    2024-07-18 12:46:02       25 阅读
  10. C语言:进程间通信

    2024-07-18 12:46:02       19 阅读