0
点赞
收藏
分享

微信扫一扫

Leetcode面T2(1-8)链表,kotlin构造器

单调先生 2022-02-17 阅读 30

class Solution {

public void deleteNode(ListNode node) {

//删除当前节点node ,可以删去其下一个节点,

//并将下一个节点的值赋值给当前节点

node.val = node.next.val;

node.next = node.next.next;

}

}

Q2.4 分割链表

class Solution {

/*

这个题目的意思其实是:将所有小于 x 的节点放在 x 节点之前

例如:

[1,4,3,2,5,2] 3 -> [1, 2, 2, 3, 4, 5]

[3, 5, 8, 5, 10, 2, 1] 5 -> [1, 2, 3, 5, 5, 8, 10]

方法: 双指针

cur 为遍历的当前节点。pre 为遍从前向后第一个未交换的节点

cur 向后遍历过程总若遇到小于 x 的元素 则与pre 进行交换

*/

public ListNode partition(ListNode head, int x) {

ListNode cur = head;

ListNode pre = head;

while (cur != null) {

if (cur.val < x) {

swap(cur, pre);

pre = pre.next;

}

cur = cur.next;

}

return head;

}

public void swap(ListNode p1, ListNode p2) {

int temp = p1.val;

p1.val = p2.val;

p2.val = temp;

}

}

Q2.5 链表求和

思路:

用递归解法,分别从两个链表的第一个节点开始,取一个值相加,相加的结果对10取模,取模得到值作为结果的一位节点。重复上述操作再从两个链表的下一位取值相加( 注 意 得 加 上 前 一 次 操 作 的 进 位 ) \color{red}{(注意得加上前一次操作的进位)}(注意得加上前一次操作的进位),结果存入结点,通过递归将这些节点连接起来。

/**

  • Definition for singly-linked list.

  • public class ListNode {

  • int val;
    
  • ListNode next;
    
  • ListNode(int x) { val = x; }
    
  • }

*/

class Solution {

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {

//add为求和函数

ListNode res = add(l1, l2, 0);

return res;

}

//head1和head2分别为两个链表的第一个元素,value为上一次操作的进位

static ListNode add(ListNode head1,ListNode head2, int value) {

if (head1 == null && head2 == null) {

if (value == 1) {

//最后还有进位需要生成最后一个值为1的节点

return new ListNode(1);

} else {

//已完成最后一位的相加操作,开始逐层返回

return null;

}

}

if (head1 != null) {

//链表1要相加的那位不为空就把值加上

value += head1.val;

}

if (head2 != null) {

//链表2要相加的那位不为空就把值加上

value += head2.val;

}

//如果两个值相加后>=10就会产生进位,对10取模可得到减去进位的值

ListNode res = new ListNode(value % 10);

//如果两位相加的值小于10则没有进位,即进位为0

//如果两位相加的值>=10,则要向高位进1

//此处value值的意义变成了向高位的进位

value = value < 10 ? 0 : 1;

//此处的三目运算符功能是防止产生空指向异常,只有head1或者head2

//不为空的情况才下才有next节点

//传入的value值为向高位的进位

res.next = add(head1null?null:head1.next, head2null?null:head2.next, value);

return res;

}

}

Q2.6 回文链表

class Solution {

public boolean isPalindrome(ListNode head) {

if(head == null || head.next == null){

return true;

}

//找到链表中间点

ListNode low = head;

ListNode fast = head;

while(fast != null && fast.next != null){

low = low.next;

fast = fast.next.next;

}

if(fast != null){//说明有奇数个结点,low需要再走一步。

low = low.next;

}

//翻转后半段链表

ListNode cur = low.next;

low.next = null;

while(cur != null){

ListNode temp = cur.next;

cur.next = low;

low = cur;

cur = temp;

}

//比较前后段是否一致

while(low != null){

if(low.val != head.val){

return false;

}

low = low.next;

head = head.next;

}

return true;

}

}

Q2.7 链表相交

总结:

在这里插入图片描述

1.这里是单项链表,不可能出现剪刀形状的相交。

2.这里的是的相交是下面的情况

3.让两个节点分别从一个链表的首部开始,走完一个链表重新走另外一个链表,如果相遇必然相交,因为走的路径都是AD+DC+BD

public class Solution {

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {

if(headAnull||headBnull)

{

return null;

}

ListNode p1=headA;

ListNode p2=headB;

while(p1!=p2)

{

p1=p1==null? headB:p1.next;

p2=p2==null? headA:p2.next;

}

return p1;

}

}

Q2.8 环路检测

总结:

各行各样都会淘汰一些能力差的,不仅仅是IT这个行业,所以,不要被程序猿是吃青春饭等等这类话题所吓倒,也不要觉得,找到一份工作,就享受安逸的生活,你在安逸的同时,别人正在奋力的向前跑,这样与别人的差距也就会越来越遥远,加油,希望,我们每一个人,成为更好的自己。

  • 点击此处,与我们一起交流学习

文件夹有以下学习笔记,自行下载!

  • BAT大厂面试题、独家面试工具包,

  • 资料免费领取,包括 数据结构、Kotlin、计算机网络、Framework源码、数据结构与算法、小程序、NDK、Flutter,


    解释:链表中没有环。

总结:

各行各样都会淘汰一些能力差的,不仅仅是IT这个行业,所以,不要被程序猿是吃青春饭等等这类话题所吓倒,也不要觉得,找到一份工作,就享受安逸的生活,你在安逸的同时,别人正在奋力的向前跑,这样与别人的差距也就会越来越遥远,加油,希望,我们每一个人,成为更好的自己。

  • 点击此处,与我们一起交流学习

文件夹有以下学习笔记,自行下载!

  • BAT大厂面试题、独家面试工具包,

  • 资料免费领取,包括 数据结构、Kotlin、计算机网络、Framework源码、数据结构与算法、小程序、NDK、Flutter,

    [外链图片转存中…(img-Eu4ijvAg-1645108039673)]

举报

相关推荐

0 条评论