题目描述:
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
示例 2:
输入:l1 = [], l2 = []
输出:[]
示例 3:
输入:l1 = [], l2 = [0]
输出:[0]
初步思路:
·满足顺序(选择更小)
·遍历
·注意链表的特点
代码实现:
java
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 class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
// 创建一个虚拟的头节点
ListNode dummy = new ListNode();
ListNode current = dummy;
// 遍历两个链表,选择较小的节点连接到新链表
while (l1 != null && l2 != null) {
if (l1.val <= l2.val) {
current.next = l1; // 将 l1 的节点加入新链表
l1 = l1.next; // l1 向后移动
} else {
current.next = l2; // 将 l2 的节点加入新链表
l2 = l2.next; // l2 向后移动
}
current = current.next; // current 移动到新链表的末尾
}
// 如果 l1 或 l2 中有剩余的节点,直接连接到新链表的末尾
if (l1 != null) {
current.next = l1;
} else if (l2 != null) {
current.next = l2;
}
// 返回新链表的头节点,跳过虚拟的头节点
return dummy.next;
}
// 打印链表的工具方法
public void printList(ListNode head) {
ListNode current = head;
while (current != null) {
System.out.print(current.val + " ");
current = current.next;
}
System.out.println();
}
public static void main(String[] args) {
Solution solution = new Solution();
// 创建两个示例链表 l1 和 l2
ListNode l1 = new ListNode(1, new ListNode(2, new ListNode(4)));
ListNode l2 = new ListNode(1, new ListNode(3, new ListNode(4)));
// 合并链表
ListNode mergedList = solution.mergeTwoLists(l1, l2);
// 打印合并后的链表
solution.printList(mergedList); // 输出: 1 1 2 3 4 4
}
}