一、 链表的基本知识
链表是一种动态的存储结构,链表中每个结点的存储空间不是预先分配的,而是运行时系统根据需求生成的,因此建立单链表从空表开始,每读入一个数据则申请一个结点,然后插在链表的头部。
1、单链表的建立
第一个结点问题
“第一结点问题”的存在使得链表的插入、删除、等操作中需要考虑目标结点是不是第一个结点(操作不同),操作不便。因此,有时在链表的头部加入一个“头结点”,头结点类型与链表的数据结构类型一致,标识链表的头指针变量L中存放头结点的地址,这样即使是空表,头指针也不为空了。头结点的加入使得“第一个结点”的问题不复存在,也使得空表和非空表的处理一致。
头结点的数据域无定义,指针域中存放的是第一个数据结点的的地址,空表时为空。
问题:初始化,链表的初始化问题,不能直接申明吗?
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode Merge(ListNode list1,ListNode list2) {
ListNode list0 = new ListNode(0);
//保存头指针,投结点
ListNode list = list0;
//此时list和list0无区别,但是后续操作中list再不断指向下一个结点,此时的指针已不是头指针。
// if (list1 == null && list2 == null){
// return null;
// }
while (list1 != null && list2 !=null){
if(list1.val<= list2.val){
list.next = list1;
list1= list1.next;
//list = list.next;
}else{
list.next = list2;
list2 = list2.next;
// list = list.next;
}
list = list.next;
}
if(list1!= null)
list.next = list1;
if(list2!= null)
list.next = list2;
return list0.next;
//返回第一个数据结点
}
}