力扣160 21 86

力扣160链表是否相交

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。

难点在于链表长度不一,无法对应比较

解决这个问题的关键是,通过某些方式,让 p1 和 p2 能够同时到达相交节点 c1。

所以,我们可以让 p1 遍历完链表 A 之后开始遍历链表 B,让 p2 遍历完链表 B 之后开始遍历链表 A,这样相当于「逻辑上」两条链表接在了一起。

a的路程:a+c+b

b的路程:b+c+a

c为重合部分

java 复制代码
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode p1 = headA,p2 = headB;
        while(p1 != p2){
            if(p1 == null) p1 = headB;
            else p1 = p1.next;
            if(p2 == null) p2 = headA;
            else p2 = p2.next;
        }
        return p1;
    }
}

力扣21 合并两个有序链表

虚拟结点dummy ,比较后加入新链表p.

java 复制代码
class Solution {
    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        ListNode dummy = new ListNode(-1);
        ListNode p = dummy,p1 = list1,p2 = list2;
        while(p1 != null && p2 != null){
            if(p1.val <= p2.val){
                p.next = p1;
                p1 = p1.next;
            }else{
                p.next = p2;
                p2 = p2.next;
            }
            p = p.next;

        }
        if(p1 != null){
            p.next = p1;
        }
        if(p2 != null){
            p.next = p2;
        }
        return dummy.next;
    }
}

力扣86 分隔链表

给你一个链表的头节点 head 和一个特定值x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。

你应当 保留 两个分区中每个节点的初始相对位置。

java 复制代码
class Solution {
    public ListNode partition(ListNode head, int x) {
        ListNode dummy1 = new ListNode(-1);
        ListNode dummy2 = new ListNode(-1);
        ListNode p1 = dummy1,p2 = dummy2;
        ListNode p = head;
        while(p != null){
            if(p.val >= x){
                p2.next = p;
                p2 = p2.next;
            }
            else{
                p1.next = p;
                p1 = p1.next;
            }
            ListNode temp = p.next;
            p.next = null;
            p = temp;
        }
        p1.next = dummy2.next;
        return dummy1.next;

    }
}

力扣141 环形链表,判断给出的链表中是否有环

复制代码
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。
java 复制代码
public class Solution {
    public boolean hasCycle(ListNode head) {
     ListNode fast = head , slow = head;
     while(fast != null && fast.next != null){
        slow = slow.next;
        fast = fast.next.next;
        if(fast == slow) return true;
     }   
     
     return false;
    }
}

力扣206反转链表

java 复制代码
class Solution {
    public ListNode reverseList(ListNode head) {
        if(head == null || head.next == null){
            return head;
        }
        ListNode pre ,cur,nxt;
        pre = null;cur = head;nxt = cur.next;
        while(cur != null){
            cur.next = pre;
            pre = cur;
            cur = nxt;
            if(nxt !=null){
                nxt = nxt.next;
            }
        }
        return pre;
    }
}

力扣234回文链表

java 复制代码
/**
 * 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 boolean isPalindrome(ListNode head) {
        ListNode mid = middleNode(head);
        ListNode head2 = reverse(mid);
        while(head2 != null){
            if(head.val != head2.val){
                return false;
            } 
            head = head.next;
            head2 = head2.next;

        }
        return true;
    }
    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;
    }

    private ListNode reverse(ListNode head){
        ListNode pre = null;
        ListNode cur = head;
        while (cur != null){//
            ListNode nxt = cur.next;
            cur.next = pre;
            pre = cur;
            cur = nxt;
        }
        return pre;
    }
}

力扣142 环形链表2

java 复制代码
public class Solution {
    public ListNode detectCycle(ListNode head) {
        ListNode fast = head,slow = head;
        while(fast != null && fast.next != null){
            fast = fast.next.next;
            slow = slow.next;
            if(fast == slow ){
                break; 
            }
        }
        if(fast == null || fast.next == null){
            return null;
        }
        slow = head;
        while(slow != fast){
            slow =slow.next;
            fast = fast.next;
        }
        return slow;
    }
}

2. 两数相加

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

复制代码
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
java 复制代码
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        return addfc(l1, l2,0);

    }

    public ListNode addfc(ListNode l1, ListNode l2,int carry){
        if(l1 == null && l2 == null && carry == 0){
            return null;
        }
        int s = carry;
        if( l1 != null){
            s += l1.val;
            l1 = l1.next;
        }
        if(l2 != null){
            s += l2.val;
            l2 = l2.next;
        }
        return new ListNode(s % 10, addfc(l1,l2,s / 10));
    }
}
相关推荐
悠仁さん6 分钟前
非类型模板参数的特化与偏特化
java·数据结构·算法
垆边人似月.9 分钟前
最优河堤加固(二分答案 + 前缀和)
算法
171320330计算机毕设编程30 分钟前
计算机毕业设计 基于Hadoop的新能源汽车发展前景分析 LW PPT
java·大数据·hadoop·python·算法·随机森林·线性回归
垆边人似月.1 小时前
幻兽防御战(贪心算法)
数据结构·算法
DongQiShanRen1 小时前
六根硬件映射(下):物理闭环五步法,抽一条已实装的看
大数据·jvm·人工智能·算法·rust·哈希算法·集成学习
Code_Solitude1 小时前
c语言:指针(3)+冒泡排序
java·c语言·算法
FPGA信号处理1 小时前
【模式识别】第四节课:支持向量机
算法·机器学习·支持向量机
ychqsq1 小时前
233.绽放
经验分享·职场和发展
碧海银沙音频科技研究院1 小时前
面向长尾音频分类的知识蒸馏研究
人工智能·算法·音视频
alphaTao2 小时前
LeetCode 每日一题 2026/10/12-2026/10/18
算法·leetcode