首页 > 其他分享 >LeetCode Day04 24&19&02.07&142

LeetCode Day04 24&19&02.07&142

时间:2023-10-15 18:36:46浏览次数:33  
标签:24 结点 ListNode 19 next 链表 curB curA 142

24. 两两交换链表中的节点

这题使用虚拟头结点会更好做,因为有虚拟头结点我们交换结点的时候步骤会更加清晰。

操作此类有指针类型的题目要注意:1.画图避免混乱  2.注意指针先后顺序

class Solution {
    public ListNode swapPairs(ListNode head) {
        ListNode dumyhead = new ListNode(-1); // 设置一个虚拟头结点
        dumyhead.next = head; // 将虚拟头结点指向head,这样方面后面做删除操作
        ListNode cur = dumyhead;
        ListNode temp; // 临时节点,保存两个节点后面的节点
        ListNode firstnode; // 临时节点,保存两个节点之中的第一个节点
        ListNode secondnode; // 临时节点,保存两个节点之中的第二个节点
        while (cur.next != null && cur.next.next != null) {
            temp = cur.next.next.next;
            firstnode = cur.next;
            secondnode = cur.next.next;
            cur.next = secondnode;       // 步骤一
            secondnode.next = firstnode; // 步骤二
            firstnode.next = temp;      // 步骤三
            cur = firstnode; // cur移动,准备下一轮交换
        }
        return dumyhead.next; 
    }
}

 

 19. 删除链表的倒数第 N 个结点 这题在考408数据结构的时候有印象也有类似的算法,有个很巧妙的解法就是利用双指针同时指向链表头,然后快指针先走n步,等到快指针走到第n个结点时,处于头结点的慢指针开始和快指针同时往后走,直到快指针把整个链表表走完停止,这时就会发现慢指针刚好停留在第n-1个结点上,此时我们只需要令慢指针的下一个结点指向下下一个位置的结点即可删除掉这个n号元素,也就是slow.next = slow.next.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 removeNthFromEnd(ListNode head, int n) {
        ListNode dummyNode = new ListNode(0);
        dummyNode.next = head;
        ListNode slowIndex = dummyNode;
        ListNode fastIndex = dummyNode;
        for(int i = 0; i < n; i ++){
            fastIndex = fastIndex.next;
        }

        while(fastIndex.next != null){
            slowIndex = slowIndex.next;
            fastIndex = fastIndex.next;
        }
        slowIndex.next = slowIndex.next.next;
        return dummyNode.next;
    }
}
View Code

 

面试题 02.07. 链表相交

这题思路类似上一题,求两个链表的相交结点,我们可以先找到两个链表之间的长度差gap,然后选择让较长的那个链表指针先走gap步,接着再两个链表指针同时走动,当找到一个点是A=B的时候说明这个结点就是链表相交点。

/**
 * 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 curA = headA;
        ListNode curB = headB;
        int lenA = 0, lenB = 0;
        while (curA != null) { // 求链表A的长度
            lenA++;
            curA = curA.next;
        }
        while (curB != null) { // 求链表B的长度
            lenB++;
            curB = curB.next;
        }
        curA = headA;
        curB = headB;
        // 让curA为最长链表的头,lenA为其长度
        if (lenB > lenA) {
            //1. swap (lenA, lenB);
            int tmpLen = lenA;
            lenA = lenB;
            lenB = tmpLen;
            //2. swap (curA, curB);
            ListNode tmpNode = curA;
            curA = curB;
            curB = tmpNode;
        }
        // 求长度差
        int gap = lenA - lenB;
        // 让curA和curB在同一起点上(末尾位置对齐)
        while (gap-- > 0) {
            curA = curA.next;
        }
        // 遍历curA 和 curB,遇到相同则直接返回
        while (curA != null) {
            if (curA == curB) {
                return curA;
            }
            curA = curA.next;
            curB = curB.next;
        }
        return null;
    }
}
View Code

 

142. 环形链表 II
public class Solution {
    public ListNode detectCycle(ListNode head) {
        ListNode slow = head;
        ListNode fast = head;
        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
            if (slow == fast) {// 有环
                ListNode index1 = fast;
                ListNode index2 = head;
                // 两个指针,从头结点和相遇结点,各走一步,直到相遇,相遇点即为环入口
                while (index1 != index2) {
                    index1 = index1.next;
                    index2 = index2.next;
                }
                return index1;
            }
        }
        return null;
    }
}
View Code

 

   

标签:24,结点,ListNode,19,next,链表,curB,curA,142
From: https://www.cnblogs.com/LinawZ/p/17765943.html

相关文章

  • 2023-2024-1 20231402《计算机基础与程序设计》第3周学习总结
    2023-2024-120231402《计算机基础与程序设计》第3周学习总结作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里2023-2024-1计算机基础与程序设计第3周作业这个作业的目标自学计算机科学概论第2章,第3章,《C语言程序设计》第2章......
  • 2023-2024-1 20231414 《计算机基础与程序设计》第三周总结
    学期(2023-2024-1)学号(20231414)《计算机基础与程序设计》第三周学习总结作业信息这个作业属于哪个课程<班级的链接>(2023-2024-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(2023-2024-1计算机基础与程序设计第三周作业)这个作业的目标<写上具体方面......
  • 2023-2024-1 20231325 《计算机基础与程序设计》第三周学习总结
    目录作业信息教材学习内容总结1.《计算机科学概论》第二章,第三章2.《c语言程序设计》第二章作业信息这个作业属于哪个课程2023-2024-1《计算机基础与程序设计》这个作业的要求在哪里1.学习《计算机科学概论》第二章,第三章并完成云班课测试;2.学习《C语言程......
  • 2023-2024-1 20231320 《计算机基础与程序设计》第三周学习总结
    2023-2024-120231320《计算机基础与程序设计》第三周学习总结作业信息这个作业属于哪个课程<班级的链接>(2023-2024-1计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(2022-2023-1计算机基础与程序设计第三周作业)这个作业的目标<自学《计算机基础与......
  • 苹果10月24日推送iOS 17.1:修复iPhone 12辐射超标问题 信号会更差
    前段时间在iPhone15系列发布的当天,法国突然宣布iPhone12不能在该国销售,理由是iPhone12超过了当地无线电频率暴露的法定范围。根据法国监管机构ANFR(国家频率管理局)发布的最新消息,苹果将会在10月24日推送iOS17.1正式版,届时将解决iPhone12辐射超标问题。据悉,新系统将会降低iP......
  • AtCoder Beginner Contest 324
    D-SquarePermutation须知:最大的平方数的平方一定小于等于10n,平方数最多为10(n/2)(因为再大会越界)因为要求的数一定是原数的排列组合,所以它们的元素和对应的元素个数一定相同所以只要判断平方数的字符串是否与原字符串相等即可(这里可以利用排序判断)点击查看代码#include<bi......
  • AtCoder Beginner Contest 324 DF题题解
    比赛链接D-SquarePermutation其实比较简单,但是比赛时候脑子不转了,竟然在尝试枚举全排列,然后算了一下复杂度直接不会做了。正解应该是枚举完全平方数,底数枚举到\(sqrt(10^{14})\)即可,因为n最大为13。然后统计一下这个完全平方数各个数字出现了多少个,和读入的比较一下是......
  • 2023-2024-1 20231308 《计算机基础与程序设计》第三周学习总结
    2023-2024-120231308《计算机基础与程序设计》第三周学习总结作业信息作业课程2023-2024-1-计算机基础与程序设计作业要求2023-2024-1计算机基础与程序设计第三周作业作业目标自学《计算机科学概论》第2章,第3章,《C语言程序设计》第2章作业正文https://www.c......
  • 2023-2024-1 20231326 《计算机基础与程序设计》第三周周总结
    2023-2024-120231326《计算机基础与程序设计》第三周周总结目录2023-2024-120231326《计算机基础与程序设计》第三周周总结作业信息教材内容总结《计算机科学概论》《C语言程序设计》学习进度条作业信息这个作业属于哪个课程2022-2023-1-计算机基础与程序设计这......
  • 2023-2024-1 20211319《计算机基础与程序设计》第三周学习总结
    2023-2024-120211319《计算机基础与程序设计》第三周学习总结作业信息这个作业属于哪个课程<班级的链接>(如2023-2024-1-计算机基础与程序设计)这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK03这个作业的目标<写上具体方面>作业正文......