由于平时荒废了学习工作,等到想要找工作才发现已经遗忘忘了,开始重新刷算法题。
合并两个有序链表是一个常见的算法问题,特别在链表操作中。这个问题可以使用递归或迭代的方式解决,下面将详细讲解如何在Java中合并两个有序链表。
链表节点类
首先,我们需要定义一个链表节点的类。这个节点类包含一个整数值 val 和一个指向下一个节点的指针 next。下面是这个节点类的定义:
public class ListNode {
int val;
ListNode next;
ListNode(int val) {
this.val = val;
}
}
迭代方法
使用迭代方法合并两个有序链表是比较直接的方式。我们可以创建一个哑节点(dummy node)来简化合并过程,并使用一个指针指向当前节点。下面是合并两个有序链表的迭代方法的代码:
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode dummy = new ListNode(-1); // 创建一个哑节点
ListNode current = dummy; // 创建一个指针指向当前节点
while (l1 != null && l2 != null) {
if (l1.val < l2.val) {
current.next = l1;
l1 = l1.next;
} else {
current.next = l2;
l2 = l2.next;
}
current = current.next;
}
// 如果某个链表还有剩余元素,直接连接到新链表末尾
if (l1 != null) {
current.next = l1;
} else {
current.next = l2;
}
return dummy.next; // 返回合并后的链表(跳过哑节点)
}
这个方法中,我们使用两个指针 l1 和 l2 分别指向两个输入链表的当前节点,然后比较它们的值,将较小的节点添加到新链表中,同时移动相应的指针。最后,我们检查是否有一个链表还有剩余元素,如果有,直接将它们接在新链表的末尾。
使用示例
现在我们可以使用上面的方法来合并两个有序链表。以下是一个示例用法:
ListNode l1 = new ListNode(1);
l1.next = new ListNode(2);
l1.next.next = new ListNode(4);
ListNode l2 = new ListNode(1);
l2.next = new ListNode(3);
l2.next.next = new ListNode(4);
ListNode mergedList = mergeTwoLists(l1, l2);
这个示例合并了两个有序链表 l1 和 l2,并将结果存储在 mergedList 中。
整体思路就是这样,算法感觉还是得看看,长时间不做就忘完了。。。。