我的题解
遍历合并
/**
* 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 mergeTwoLists(ListNode list1, ListNode list2) {
if(list1 == null && list2 == null)
return list1;
else if(list1 == null)
return list2;
else if(list2 == null){
return list1;
}
ListNode ans = new ListNode();
if(list1.val <= list2.val){
ans.val = list1.val;
list1 = list1.next;
}else{
ans.val = list2.val;
list2 = list2.next;
}
ans.next = null;
ListNode tail = ans;//指向最后一个元素
while(list1 != null && list2 != null){
if(list1.val < list2.val){
tail.next = list1;
tail = list1;
list1 = list1.next;
}else if(list1.val > list2.val){
tail.next = list2;
tail = list2;
list2 = list2.next;
}else{
tail.next = list1;
tail = list1;
list1 = list1.next;
tail.next = list2;
tail = list2;
list2 = list2.next;
}
}
if(list1 != null)
tail.next = list1;
else if(list2 != null)
tail.next = list2;
return ans;
}
}
很无语,属实是很久没碰了,最简单的合并链表都这么多问题。
前缀法
待合并链表都是升序的,且-100 <= Node.val <= 100
。根据这个数据范围,设一个表 u[201]
,u[i]
表示 链表
L
1
L_1
L1 中 i+200
的元素个数
遍历链表
L
2
L_2
L2 ,每相邻两个元素确定一个区间
[
a
,
b
]
[a,b]
[a,b]。若
k
∈
[
a
,
b
]
k \in [a,b]
k∈[a,b] 且 u[k+200]
不为0,将u[k]
个元素插入
L
2
L_2
L2 中
自我评价:瞎折腾,等于没优化
/**
* 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 mergeTwoLists(ListNode list1, ListNode list2) {
int[] u = new int[210];
ListNode p = list1;
while(p!= null){
u[p.val]++;
p = p.next;
}
//解决list1[0].val < list2[0].val
if(list1.val < list2.val){
p = list1.next; //中间结点保存list1的下一个结点
u[list1.val+200]--; //list1中该元素个数减1
list1.next = list2; //将list1的首结点指向list2首结点
list2 = list1; //更新List2的首结点
list1 = p; //更新list1的首结点
}
p = list2; //p指向队首元素
//若list1[0].val < list2[0].val 更新后的list1[0]还有可能等于list2[0].val
int i;
ListNode pre;
while(p.next != null){
//区间为 [p.val,p.next.val]
for(i = p.val;i <= p.next.val;++i){
pre = p;
while(u[i+200]-- != 0){
ListNode q = new ListNode(i+200);
pre.next = q;
pre = q;
if(u[i+200] == 1){
q.next = p.next;
}
}
}
p = p.next;
}
return list2;
}
}
报内存超限
题解
。。。我想太多了
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
// 使用带头结点的链表解决问题
// 待输出链表的头部
ListNode head = new ListNode();
// 结果链表的 尾结点游标
ListNode last = head;
while(l1 != null && l2 != null) {
if(l1.val > l2.val) {
last.next = l2;
l2 = l2.next;
}else{
last.next = l1;
l1 = l1.next;
}
last = last.next;
}
// l1 或 l2 可能还有剩余结点没有合并,
// 由于从上面的 while 循环中退出, 那么链表 l1 和 l2 至少有一个已经遍历结束
if(l1 != null) last.next = l1;
if(l2 != null) last.next = l2;
return head.next;
}
}
作者:caddy-k
链接:https://leetcode-cn.com/problems/merge-two-sorted-lists/solution/yuan-lai-hui-luo-ji-qing-xi-jian-dan-yi-77we1/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
问题
while
我开始不写会忘掉 “+1” ,所以要养成习惯,写完大括号直接 “+1” ,再写其他循环体