[Java 算法 ] 链表

练习一 : 两数相加

2. 两数相加 - 力扣(LeetCode)

java 复制代码
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode newHead = new ListNode();
        ListNode prev = newHead;
        ListNode cur1 = l1,cur2 = l2;
        int t = 0;
        while(cur1!=null||cur2!=null||t!=0){
            ListNode node = new ListNode();
            if(cur1!=null){
                t+=cur1.val;
                cur1 = cur1.next;
            }
            if(cur2!=null){
                t+=cur2.val;
                cur2 = cur2.next;
            }
            prev.next = node;
            prev = prev.next;
            node.val = t%10;
            t /=10;
        }
        return newHead.next;
    }
}

算法原理

  • 两个链表从左到右 就是数字的个位、十位、百位......
  • 每一位相加 = 链表 1 当前值 + 链表 2 当前值 + 上一位的进位
  • 当前位结果 = 和 % 10
  • 进位 = 和 / 10
  • 直到两个链表都走完 + 进位也为 0,结束

练习二 : 两两交换链表中的节点

24. 两两交换链表中的节点 - 力扣(LeetCode)

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 ListNode swapPairs(ListNode head) {
        if(head == null||head.next == null){
            return head;
        }
        ListNode newHead = new ListNode(0);
        newHead.next = head;

        ListNode prev = newHead,cur = head,curN = cur.next,curNN;
        
        while(cur != null && curN != null){
            curNN = curN.next;  // 每次循环重新取
            
            prev.next = curN;
            curN.next = cur;
            cur.next = curNN;

            prev = cur;  
            cur = curNN;
            
            if(cur != null) curN = cur.next;
            else curN = null;
        }

        return newHead.next;
    }
}

算法原理

迭代 + 三指针 + 哨兵节点

  1. 哨兵节点统一头节点和普通节点的交换逻辑
  2. 每次处理两个节点:cur 和 curN
  3. 交换步骤:
    • 前驱节点指向第二个节点
    • 第二个节点指向第一个节点
    • 第一个节点指向后面的节点
  4. 交换完,指针移动到下一对
  5. 直到后面不足两个节点,停止

练习三 : 合并 k 个升序链表

23. 合并 K 个升序链表 - 力扣(LeetCode)

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 ListNode mergeKLists(ListNode[] lists) {
        PriorityQueue<ListNode> queue = new PriorityQueue<>((v1,v2)->v1.val-v2.val);
        for(ListNode t: lists){//将数组中的元素放入链表中, 存的全是链表的头结点
            if(t!=null) queue.offer(t);
        }
        ListNode newHead = new ListNode(0);
        ListNode prev = newHead;
        while(!queue.isEmpty()){
            ListNode cur = queue.poll();
            prev.next = cur;
            prev = cur;
            if(cur.next!=null) queue.offer(cur.next);
        }
        return newHead.next;
    }
}

算法原理

最小堆(小根堆)+ 贪心算法

  1. 所有链表的头节点放进堆
  2. 堆会自动把最小的节点放到堆顶
  3. 每次取出最小值,接到结果链表
  4. 把这个节点的下一个节点再放进堆
  5. 重复直到堆空
相关推荐
Old Uncle Tom4 分钟前
OpenClaw 记忆系统 -- 记忆预加载
java·数据结构·算法·agent
会编程的土豆13 分钟前
洛谷题单入门1 顺序结构
数据结构·算法·golang
小小小米粒16 分钟前
Collection单列集合、Map(Key - Value)双列集合,多继承实现。
java·开发语言·windows
生信碱移16 分钟前
PACells:这个方法可以鉴定疾病/预后相关的重要细胞亚群,作者提供的代码流程可以学习起来了,甚至兼容转录组与 ATAC 两种数据类型!
人工智能·学习·算法·机器学习·数据挖掘·数据分析·r语言
智者知已应修善业36 分钟前
【51单片机中的打飞机设计】2023-8-25
c++·经验分享·笔记·算法·51单片机
摇滚侠1 小时前
expdp 查看帮助
java·数据库·oracle
:1211 小时前
java基础
java·开发语言
曹牧2 小时前
Spring:@RequestMapping注解,匹配的顺序与上下文无关
java·后端·spring
daixin88482 小时前
cursor无法正常使用gpt5.5等模型解决方案
java·redis·cursor
智者知已应修善业3 小时前
【51单片机按键调节占空比3位数码管显示】2023-8-24
c++·经验分享·笔记·算法·51单片机