Day04 链表part2
我的思路:
交换的时候,需要保存断开链表后的第一个指向结点,虚拟头结点指向改变了,在此之前就需要保存虚拟头结点的下一个结点
解答:
class Solution {
public ListNode swapPairs(ListNode head) {
ListNode h = new ListNode();
h.next = head;
ListNode res = h;
while(h.next != null && h.next.next != null) {
ListNode h1 = h.next;
ListNode h2 = h.next.next.next;
h.next = h.next.next;
h.next.next = h1;
h1.next = h2;
h = h1;
}
return res.next;
}
}
我的思路:
第一遍遍历链表长度,第二遍删除链表结点(提交后解答错误,添加了一些特殊情况的处理)
看完题解才恍然大悟,又可以用快慢指针,两者间距n,同时往后移动
解答:
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode h = head;
int len = 0;
while(h != null) {
h = h.next;
len ++;
}
if(len == 1) {
return null;
}
if(len == n){
return head.next;
}
ListNode h1 = head;
int count = len - n;
while(count > 1) {
h1 = h1.next;
count--;
}
h1.next = h1.next.next;
return head;
}
}
//优化后
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode h = new ListNode();
h.next = head;
ListNode h1 = h;
ListNode h2 = h;
while(n >= 0 && h1 != null) { // 需要写上h1 != null
h1 = h1.next;
n--;
}
// h1 = h1.next;
while(h1 != null){
h = h.next;
h1 = h1.next;
}
h.next = h.next.next;
return h2.next;
}
}
我的思路:
A比B多几个到交点,就先走几步
记录一个弱智问题:while循环忘了写上count–
解答:
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode hA = headA;
ListNode hB = headB;
int lenA = 0, lenB = 0;
while(hA != null) {
hA = hA.next;
lenA++;
}
while(hB != null) {
hB = hB.next;
lenB++;
}
ListNode h1 = headA;
ListNode h2 = headB;
if(lenA >= lenB) {
int count = lenA - lenB;
while(count > 0) {
h1 = h1.next;
count--;
}
while(h1 != h2) {
h1 = h1.next;
h2 = h2.next;
}
return h1;
}
if(lenA < lenB) {
int count = lenB - lenA;
while(count > 0) {
h2 = h2.next;
count--;
}
while(h1 != h2) {
h1 = h1.next;
h2 = h2.next;
}
return h1;
}
return null;
}
}
我的思路:
又看了一遍题解想起来了,快慢指针+数学题
解答:
public class Solution {
public ListNode detectCycle(ListNode head) {
ListNode slow = head;
ListNode fast = head;
while(fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
if(slow == fast) {
ListNode meet = slow;
ListNode h1 = head;
while(h1 != meet) {
h1 = h1.next;
meet = meet.next;
}
return h1;
}
}
return null;
}
}
6.19更新简洁做法
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA == null || headB == null) {
return null;
}
ListNode pA = headA;
ListNode pB = headB;
while(pA != pB) {
pA = (pA == null) ? headB :pA.next;
pB = (pB == null) ? headA :pB.next;
}
return pA;
}
}