代码随想录算法训练营第四天|Leetcode 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II

Leetcode.24 两两交换链表中的节点

get到的一些点

1.在更新节点的新指向时,有的地方可以有两种写法,但是选取与前面代码同样的结构写法,更符合循环不变量的原则。

Leetcode.19 删除链表的倒数第N个节点

get到的点

1.快慢指针在这里的应用,以及循环的终止条件设置为快指针
2.单向链表 要删除某个节点,那么当前循环的节点应该是待删除节点的前一个节点,通过cur->next->val target数值比较是否相等,判断下个节点是否为待删除节点

掉坑点

1.while循环有个坑点

int i = 4;
while(i--){
cout<<i<<endl;
}

打印结果如下:

3
2
1
0

发现没,i是先减减之后,在输出,在用于循环判断;

第一次循环:i = 4,用于循环判断---> 可以进入循环---->i减减(此时i = 3了)---->输出 i ,打印3
第二次循环:i = 3,用于循环判断---> 可以进入循环---->i减减(此时i = 2了)---->输出 i ,打印2
第三次循环:i = 2,用于循环判断---> 可以进入循环---->i减减(此时i = 1了)---->输出 i ,打印1
第四次循环:i = 1,用于循环判断---> 可以进入循环---->i减减(此时i = 0了)---->输出 i ,打印0
第一次循环:i = 0,用于循环判断---> 未能进入循环;

我之前以为是,执行完while循环的所有内容后,i才会进行减减操作,之前人为的过程应该是这样的:

第一次循环:i = 4,用于循环判断---> 可以进入循环---->输出 i ,打印4---->i减减(此时i = 3了)
第二次循环:i = 3,用于循环判断---> 可以进入循环---->输出 i ,打印3---->i减减(此时i = 2了)
第三次循环:i = 2,用于循环判断---> 可以进入循环---->输出 i ,打印2---->i减减(此时i = 1了)
第四次循环:i = 1,用于循环判断---> 可以进入循环---->输出 i ,打印1---->i减减(此时i = 0了)
第一次循环:i = 0,用于循环判断---> 未能进入循环;

面试题02.07.链表相交

完美实现,自己想到了解法,真开心。

1.两个链表右侧对齐,让长链表指针移动到与短链表头节点对齐的位置,在更新判断两个链表指针是否相等,相等了,则说明是交点,或nullptr末尾位置。直接返回最后指针即可。

贴下代码吧

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        //找到较短的那个链表,标记出那个链表短,长,以及各自长度
        //长链表先循环至短链表相同长度,在检验地址是否相同

        int longLen = 0;
        int shortLen = 0;
        ListNode* longList = headA;
        ListNode* shortList = headB;
        //获取长度,先假设A列表长于B列表
        while(longList != nullptr){
            longList = longList->next;
            longLen++;
        }
        while(shortList != nullptr){
            shortList = shortList->next;
            shortLen++;
        }
        //检查列表长度分配是否正确,并且初始化长、短列表头节点
        if(longLen >= shortLen){
            longList = headA;
            shortList = headB;
        }
        else{
            int tmp = longLen;
            longLen = shortLen;
            shortLen = tmp;
            longList = headB;
            shortList = headA;
        }
        // int nMin = lenA <= lenB ? lenA:lenB;//获取两者中的较小值
        // int nMax = lenA <= lenB ? lenB:lenA;//获取两者中的较小值

        if(shortLen == 0){//A,B 只要有一个是空,那么就不会相交
            return nullptr;
        }
        else{
            //长链表循环至相等长度
            int i = longLen - shortLen;
            while(i--){
                longList = longList->next;
            }
            //check
            while((longList != nullptr) && (longList != shortList)){
                longList = longList->next;
                shortList = shortList->next;
            }
            return longList;
        }
    }
};

142.环形链表II

收获点

1.自己推出了,在慢指针到达环形入口点后,快指针会在慢指针的一圈时间内追上它。
2.推出了公式,但是最后怎么求解没想出来。

取长补短,向他人学习

https://blog.csdn.net/wind_996/article/details/133834572?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22133834572%22%2C%22source%22%3A%22wind_996%22%7D
从这学到了几个技巧:
1.两个循环 — > 一个循环:

两个循环:
		while(longList != nullptr){
            longList = longList->next;
            longLen++;
        }
        while(shortList != nullptr){
            shortList = shortList->next;
            shortLen++;
        }
一个循环:
		while(longList || shortList){
			if(longList){
				longList = longList->next;
				longLen++;
			}
			if(shortList){
				shortList = shortList->next;
				shortLen++;
			}
		}

2.while循环条件 指针不等于空 —> 直接写指针

不等号形式:
while(ptr != nullptr){
	cout<<endl;
}

直接指针形式:
while(ptr){
	cout<<endl;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值