206反转链表
题目描述:
思路:尽量做到一次遍历,每次反转一条链的时候要先保存下一个节点,防止反转后找不到下一个节点
public ListNode reverseList(ListNode head) {
ListNode pre = null;//前一个节点
ListNode temp = head;//当前节点
while(temp != null){
ListNode temp1 = temp.next;//提前存储下一个节点
temp.next = pre;//反转
pre = temp;//重置pre
temp = temp1;//重置temp
}
return pre;//最后pre为原本的尾节点,反转后的首节点,temp == null
}
160 相交链表
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
/**
定义两个指针, 第一轮让两个到达末尾的节点指向另一个链表的头部,
第一轮的交换正好抵消了长度差,
若相交 等两个指针第二次到交点时正好走了相同的距离
若不相交 两个指针第二次走到尾部时同时为null
*/
if(headA == null || headB == null) return null;
ListNode temp1 = headA;
ListNode temp2 = headB;
while(temp2 != temp1){
temp1 = temp1 == null ? headB : temp1.next;
temp2 = temp2 == null ? headA : temp2.next;
}
return temp1;
}