有序链表的合并问题
两个有序链表合并,并且不创建新的链表,直接合并
1、判断两个链表的头部,小的那个是合成链表的头。
2、p q 分别是第一个和第二个链表的头s是p q 判断大小之后的小的,p q中小的后移直到其中一个为空。
3、直接把不为空的连接到链表后边。
4、输出链表
合并的代码
public static <T extends Comparable<Integer>> SingleLink S(SingleLink<Integer> link1, SingleLink<Integer> link2) {
if (link1 == null && link2 == null) {
return null;
}
SingleLink.Node<Integer> p = link1.getHead();
SingleLink.Node<Integer> q = link2.getHead();
SingleLink.Node<Integer> s = null;
if(p.getValue().compareTo(q.getValue()) > 0){
s=q;
q=q.getNext();
}else {
s=p;
p=p.getNext();
}
while (p != null && q != null) {
if (p.getValue().compareTo(q.getValue()) > 0) {//p大,所以链接q
s.setNext(q);
s = q;
q = q.getNext();
} else {
s.setNext(p);
s = p;
p = p.getNext();
}
}
if (p == null) {
s.setNext(q);
}
else{
s.setNext(p);
}
if (link1.getHead().getValue().compareTo(link2.getHead().getValue())>0) {
return link2;
}
else {
return link1;
}
}
我的Single Link
public class SingleLink<T> {
private Node<T> head;
private Node<T> tail;
public void addHead(T value) {
Node<T> newNode=new Node<>(value);//申请新节点
//特殊情况
if(head==null){//链表为空->维护新尾巴
head=newNode;
tail=newNode;
}
else{
newNode.next=head;//头部加newNode
//更新新头节点
head=newNode;
}
}
public void removeHead(){
if(head==null){
return;
}
if(head==tail){
head=null;
tail=null;
}
else{
head.value=null;
head=head.next;
}
}
public void addTail(T value) {
Node<T> newNode = new Node<>(value);//申请新节点
if(head == null && tail == null) {//链表为空->维护新尾巴
head = newNode;
tail = newNode;
}
else {
tail.next = newNode;//尾部保存新节点
tail = newNode;
}
}
public Node<T>getHead(){
return head;
}
public int getSize() {
int size = 0;
while (head!=null){
head=head.next;
size++;
}
return size;
}
public Node<T> getTail() {
return tail;
}
public void setHead(Node<T> p) {
this.head=head;
}
public void setTail(Node<T> head) {
this.tail=tail;
}
static class Node<E>{
private E value;
private Node<E> next;
private Node<E> head;
public Node<E> getNext() {
return next;
}
public void setNext(Node<E> next) {
this.next = next;
}
public Node(E value) {
this.value = value;
}
public int getSize() {
int size = 0;
while (head!=null){
head=head.next;
size++;
}
return size;
}
public E getValue() {
return value;
}
}
public void show() {
for (Node<T> p = head; p != null; p = p.next) {
System.out.print(p.value + " ");
}
}
}
测试代码
public static void main(String[] args) {
SingleLink12_31<Integer> a=new SingleLink12_31<>();
SingleLink12_31<Integer> b=new SingleLink12_31<>();
a.addHead(9);
a.addHead(4);
a.addHead(2);//2 4 9
b.addHead(8);
b.addHead(7);
b.addHead(3);//3 7 8
Sum(a,b).show();
}
输出
2 3 4 7 8 9