算法刷题之路之链表初探(二)
今天来学习的算法题是leecode141环形链表,是一道简单的入门题,话不多说!直接上!
条件(Leecode21)
重点!!!
我直接把解释写代码上啦!先上文字详解!!
ListNode prehead = new ListNode(-1);
创建一个新的链表节点 prehead,值为 -1,作为合并后链表的头节点的前置节点。
ListNode prev = prehead;
创建一个指针 prev,初始化为 prehead,用来构建新链表。
while (l1 != null && l2 != null) {
进入循环,只要 l1 和 l2 都不为 null。
if (l1.val <= l2.val) {
比较 l1 和 l2 当前节点的值,如果 l1 的值小于等于 l2 的值,执行以下操作:
prev.next = l1; 将 prev 的 next 指向 l1,将 l1 加入新链表。 l1 = l1.next; 移动 l1
到下一个节点。 else {如果 l2 的值小于 l1 的值,执行以下操作:
prev.next = l2; 将 prev 的 next 指向 l2,将 l2 加入新链表。 l2 = l2.next; 移动 l2
到下一个节点。 prev = prev.next;将 prev 指向新链表的最后一个节点,即刚刚加入的节点。
循环继续,直到 l1 或 l2 中有一个为空。
prev.next = l1 == null ? l2 : l1;
循环结束后,将剩余的未合并完的链表直接接到新链表的末尾。
return prehead.next;
返回 prehead 的 next,即新链表的头节点。
这段代码的核心思想是利用一个 prev 指针构建新的链表,依次比较两个链表的节点值,将较小的节点加入新链表中,直到其中一个链表为空,然后将剩余链表直接连接到新链表的末尾。
代码
public class Leecode21 {
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; }
}
public static void main(String[] args) {
}
}
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
// 创建一个头节点 prehead,并初始化为值为 -1
ListNode prehead = new ListNode(-1);
// 将 prev 指向 prehead,用于构建新链表
ListNode prev = prehead;
// 循环条件:当 l1 和 l2 都不为 null 时
while (l1 != null && l2 != null) {
// 比较 l1 和 l2 当前节点的值
if (l1.val <= l2.val) {
// 如果 l1 的值小于等于 l2 的值,将 prev 的 next 指向 l1,并将 l1 向后移动一位
prev.next = l1;
l1 = l1.next;
} else {
// 如果 l2 的值小于 l1 的值,将 prev 的 next 指向 l2,并将 l2 向后移动一位
prev.next = l2;
l2 = l2.next;
}
// 将 prev 指向新链表的最后一个节点
prev = prev.next;
}
// 合并后 l1 和 l2 最多只有一个还未被合并完,我们直接将链表末尾指向未合并完的链表即可
prev.next = l1 == null ? l2 : l1;
// 返回合并后的链表,prehead.next 是新链表的头节点
return prehead.next;
}
}