力扣刷题笔记

通用

基本语法

  1. 字符要用‘ ’表示

两种进位加法表示

都有置于一个循环中才能实现

  1. int carry = 0;
    int t = n1 + n2 + carry;
    ​
            if(t >= 10) //需要进位
            {
                cur = t - 10;   //当前位
                carry = 1;
            }
            else    //不需要进位
            {
                cur = t;
                carry = 0;
            }
  2. int carry = 0;  //进位
    sum = n1 + n2 + carry;
    cur = sum % 10; //当前位
    carry = sum / 10; //整除,非0即1

链表

反转链表

class Solution {
    public ListNode reverseList(ListNode head) 
    {
        ListNode pre = null;    //指向前驱
        ListNode suc = head;    //存储后继结点
​
        while(head != null)
        {
            suc = head.next;    //存储后继结点
            head.next = pre;     //结点的后继指向前驱
            pre = head;     //前驱更新为当前结点
            head = suc;     //结点后移
        }
​
        return pre; //此时head为null,pre指向链表的最后一个结点
    }
}

快慢指针

通过慢指针将链表分为两部分:慢指针一次走一步,快指针一次走两步,快慢指针同时出发,当快指针移动到链表的末尾时,慢指针恰好到链表的中间。

链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

第一种

中间结点有两个,视第一个为中间结点

public ListNode endOfFirstHalf(ListNode head)
    {
        ListNode fast = head;
        ListNode slow = head;
    
        while(fast.next != null && fast.next.next != null)
        {
            fast = fast.next.next;
            slow = slow.next;
        }
​
        return slow;
    }
第二种

中间结点有两个,视第二个为中间结点

public ListNode startOfSecondHalf(ListNode head)
    {
        ListNode fast = head;
        ListNode slow = head;
    
        while(fast != null && fast.next != null)
        {
            fast = fast.next.next;
            slow = slow.next;
        }
    
        return slow;
    }

你可能感兴趣的:(数据结构,算法,数据结构)