直接贴上题目
//将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
//
//
//
// 示例 1:
//
//
//输入:l1 = [1,2,4], l2 = [1,3,4]
//输出:[1,1,2,3,4,4]
//
//
// 示例 2:
//
//
//输入:l1 = [], l2 = []
//输出:[]
//
//
// 示例 3:
//
//
//输入:l1 = [], l2 = [0]
//输出:[0]
//
//
//
//
// 提示:
//
//
// 两个链表的节点数目范围是 [0, 50]
// -100 <= Node.val <= 100
// l1 和 l2 均按 非递减顺序 排列
//
// Related Topics 递归 链表
// 👍 1726 👎 0
//leetcode submit region begin(Prohibit modification and deletion)
/**
* 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; }
* }
*/
因为链表的数目范围和值范围都比较小,开始想到的是映射到数组[-100,100]。初始化的时候数组为0,循环链表,如果哪个坐标点有值,就进行加1操作。
分析了一下,链表循环是免不了的,后面数组还得循环一遍,所以放弃了该种解法。
以下是直接同时循环两个链表,在循环的同时构建合并的链表,只要记录合并链表的尾结点不停的往后添加节点就可以了,还算简单明了。
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
//边界条件 l1 或 l2为空
if(l1 == null ){
return l2;
}else if(l2 == null){
return l1;
}
ListNode l3 = new ListNode();
ListNode tail = l3;
ListNode node;
while(l1 != null && l2 != null){
if(l1.val > l2.val){
//l2 前移一步
node = new ListNode(l2.val);
tail.next = node;
l2 = l2.next;
tail = node;
}else if(l1.val < l2.val){
//l1 前移一步
node = new ListNode(l1.val);
tail.next = node;
l1 = l1.next;
tail = node;
}else{
// l1 l2 前移一步
node = new ListNode(l1.val);
tail.next = node;
node = new ListNode(l1.val);
tail.next.next = node;
l1 = l1.next;
l2 = l2.next;
tail = node;
}
}
//l1 结束 拼接l2
if(l1 == null){
if(l2 != null){
tail.next = l2;
}
}
//l2 结束 拼接l1
if(l2 == null){
if(l1 != null){
tail.next = l1;
}
}
return l3.next;
}
}
//leetcode submit region end(Prohibit modification and deletion)