合并的解题思路
- 先创建一个虚拟ListNode节点,用来存返回的数据
- 进行循环判断,传入的两个参数ListNode不为空,对比两个传入参数ListNode的判断则进行值得判断
- 哪一个值比较大则先存哪一个,存了之后再移动指针
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode res = new ListNode(-1),tail = res;
while(l1 != null && l2 != null){
if(l1.val < l2.val){
tail = tail.next = l1;
System.out.println("上面"+tail.val);
l1 = l1.next;
}else {
tail = tail.next = l2;
System.out.println("下面"+tail.val);
l2 = l2.next;
}
}
if (l1 != null) tail.next = l1;
if (l2 != null) tail.next = l2;
return res.next;
}
删除排序链表解题思路
- 首先判断是否值重复,重复则使用p.next = p.next.next 删除该值,否则移动指针
public ListNode deleteDuplicates(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode listNode = head;
while (listNode.next != null){
if(listNode.val == listNode.next.val){
listNode.next = listNode.next.next;
}else {
listNode = listNode.next;
}
}
return head;
}
环形链表解题思路
- 首先要明白如何判断他是环形指针,主要在考察两个指针的问题
- 设置两个指针,一个走一步,一个走两步,如果后面碰到走的比较快的,他的next竟然是走的比较慢的,说明存在环形
public boolean hasCycle(ListNode head) {
if(head == null || head.next == null)return false;
ListNode p=head,q=head;
while (q != null){
p = p.next;
q = q.next;
if(q == null)return false;
q = q.next;
if(q == null)return false;
if(q.next == p || q == p)return true;
}
return false;
}
特别注意
这里我们需要熟悉对ListNode的基本操作,p = p.next 这是移动指针
p.next = x 这是添加ListNode
x = p.next 这是赋值
p.next = p.next.next 这是删除元素
let aaa = [1, 2, 3, 4]
那么 aaa.val == 1
aaa.next == [2, 3, 4];
aaa.next.val == 2