链表的基本结构
package day5;
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;
}
}
第一题 合并两个有序链表21
@Date 2022年1月18日
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
package day5;
public class 合并两个有序链表21{
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
//递归
// if (list1==null) {
// return list2;
// }else if (list2==null) {
// return list1;
// }else if (list1.val < list2.val) {
// list1.next = mergeTwoLists(list1.next, list2);
// return list1;
// }else{
// list2.next = mergeTwoLists(list1, list2.next);
// return list2;
// }
ListNode newListNode = new ListNode(0);
ListNode listNode = newListNode;
while(list1!=null && list2!=null) {
if (list1.val<= list2.val) {
listNode.next = list1;//必须将listNode的下一个赋值成list1,不能直接使用头指针
list1 = list1.next;
}else {
listNode.next = list2;
list2 = list2.next;
}
listNode = listNode.next;
}
listNode.next = list1==null ? list2 : list1;
//一方到达最终结点,把另一方的后续结点直接加到后边
//while循环中结束条件就是list1或者list2=null,所以判断不能用next了
return newListNode.next;
}
}
第二题 链表的中间结点876
**@Date 2022年1月18日
给定一个头结点为 head 的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
示例 1:
输入:[1,2,3,4,5]
输出:此列表中的结点 3 (序列化形式:[3,4,5])
返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。
注意,我们返回了一个 ListNode 类型的对象 ans,这样:
ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.
**
package day5;
//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; }
//}
public class 链表的中间结点876 {
//快慢指针了
public ListNode middleNode(ListNode head) {
if (head.next == null) {
return head;
}
ListNode slowListNode = head;
ListNode fastListNode = head;
while(fastListNode!= null&& fastListNode.next!=null) {
//当前不为空,同时下一个也不为空,才可找到奇数中间的那个和偶数右一个
//当前的下一个不为空,同时当前的下一个的下一个也不为空,则可找到奇数中间的那个和偶左一个
slowListNode = slowListNode.next;
fastListNode = fastListNode.next.next;
}
return slowListNode;
}
}
第三题 删除链表的倒数第N个结点19
@Date 2022年1月18日
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
package day5;
public class 删除链表的倒数第N个结点19 {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(0,head);
//初始化一个空节点,初始赋值为0,并且list的下一个next指针指向head,指针指向为list
ListNode firstListNode = head; //必须是head,或者若为dummy,则将循环中的i<n改成i<=n
ListNode sencondListNode = dummy;
for (int i = 0; i < n; i++) {
firstListNode = firstListNode.next;
}
while(firstListNode!= null) {
firstListNode = firstListNode.next;
sencondListNode = sencondListNode.next;
}
sencondListNode.next = sencondListNode.next.next;
return dummy.next;
/*
ListNode dummy = new ListNode(0,head);
//初始化一个空节点,初始赋值为0,并且list的下一个next指针指向head,指针指向为list
ListNode curListNode = dummy;
int count = 0;//头结点不算是结点数,所以要从0开始
while(head!=null) {
head = head.next;
count++;
}
count = count-n+1;
// while(head!=null) {
// if (count==0) {
// curListNode.next = curListNode.next.next;
//
// break;
// }
// head = head.next;
// count--;
// }
for (int i = 1; i < count; i++) {
//从第一个就开始了,到目标的前一个退出循环,把目标删除,需要找到前一个,然后修改指针
curListNode = curListNode.next;
}
curListNode.next = curListNode.next.next;//修改目标的前一个结点的指针,直接把目标删除
return dummy.next;
*/
}
}