已知两个非降序链表序列S1与S2,设计函数构造出S1与S2合并后的新的非降序链表S3。
一手编的第一个程序啊啊,好多小错误,调试了好久,不上手真的会忽视掉好多细节。。
import java.util.*;
class Node{ //结点类
public int data;
Node next = null;
public Node(int data) {
this.data = data;
}
}
public class Solution {
public static class Link{ //链表类
Node head = null;
Node tem = null;
public void addnode(int d) {
Node n = new Node(d);
if(head == null)
{head = n;
tem = head;
return;}
tem.next = n;
while(tem.next != null)//确保tem在链尾
tem = tem.next;
}
public int finddata(Node d) {
return d.data;
}
public Link merge(Link a, Link b) {
a.tem = a.head;
b.tem = b.head;
Link c = new Link();
while(a.tem != null && b.tem != null) {
if(a.finddata(a.tem)<=b.finddata(b.tem)) {
c.addnode(a.finddata(a.tem));
a.tem = a.tem.next;
}
else{
c.addnode(b.finddata(b.tem));
b.tem = b.tem.next;
}
}
while(a.tem != null) {
c.addnode(a.finddata(a.tem));
a.tem = a.tem.next;
}
while(b.tem != null) {
c.addnode(b.finddata(b.tem));
b.tem = b.tem.next;
}
return c;
}
public void print(Link d) {
d.tem = d.head;
if(d.tem == null)
{System.out.println("null");}
else{
while(d.tem.next != null) {
System.out.print(d.tem.data +" ");
d.tem = d.tem.next;
}
System.out.print(d.tem.data);
}
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
Link s1 = new Link();
Link s2 = new Link();
int count;
do {
count = in.nextInt();
if(count != -1)
s1.addnode(count);
}while(count != -1);
do {
count = in.nextInt();
if(count != -1)
s2.addnode(count);
}while(count != -1);
Link s3 = new Link().merge(s1, s2);
new Link().print(s3);
in.close();
}
}
1.最初写finddata的输入时只写了tem,结果会发生NullPointerException 空指针异常;
2.在赋值给c的时候,最初写的是c.tem.data = a.finddata.
两个错误的本质都是对链表的理解还不深,只有创建结点才能赋值,每一个链表都有单独的引用。
3.最终结果在大规模输入时内存超限,确实merge部分有很多重复代码,需要优化。