Leetcode 打卡day4 ● 24. 两两交换链表中的节点 ● 19.删除链表的倒数第N个节点 ● 面试题 02.07. 链表相交 ● 142.环形链表II


提示:以下是本篇文章正文内容,下面案例可供参考

一、leetcode 24. 两两交换链表中的节点

1.题目链接:

link

2.独立做题问题总结

一开始做的时候用的双指针

3.解法总结:

  1. 双指针法
    创建dummyhead,建立pre和cur指针分别指向dummyhead和head
    注意:循环判断条件为cur != None and cur.next != None
    在这里插入图片描述
		dummyhead = ListNode(next = head)
        pre = dummyhead
        cur = head
        while(cur != None and cur.next != None):
            temp = cur.next.next //记录cur的新位置及pre.next要指向的位置
            pre.next = cur.next //步骤1
            pre.next.next = cur //步骤2
            pre = cur //更新pre
            cur.next = temp //步骤3
            cur = cur.next //更新cur
        return dummyhead.next		
		
  1. 递归法
		if(head == None or head.next == None):
            return head
        first = head
        second = head.next
        others = head.next.next
        second.next = first
        first.next = self.swapPairs(others)
        return second

二、leetcode 19.删除链表的倒数第N个节点

1.题目链接:

link

2.独立做题问题总结

一开始做的时候用的双指针法

3.解法总结:

  1. 双指针
    首先通过快指针向前移动n位,然后快慢指针同时移动,直到fast.next为空,此时慢指针指向第n-1位,移除n即可。
	 	dummyhead = ListNode(next = head)
        fast = dummyhead
        slow = dummyhead
        while(n):
            fast = fast.next
            n -= 1
            # print(fast)
        while(fast and fast.next):
            fast = fast.next
            slow = slow.next
            # print(f"fast = {fast.val}")
            # print(f"slow = {slow.val}")
        temp = slow.next.next
        slow.next = temp
        return dummyhead.next
		

三、leetcode 面试题 02.07. 链表相交

1.题目链接:

link

2.独立做题问题总结

3.解法总结:

  1. 双指针
    A独自长度a,B独自长度b,AB公共长度c
    A,B同时next,当任意一个到末尾时将节点指向对方头节点
    当a+c+b时,如果当前为空,则无公共节点,否则当前指向的节点即为公共节点。
    判断条件为A!=B因为当结束循环时要么指向同一节点要么同为None
    (§根据快慢法则,走的快的一定会追上走得慢的。
    § 在这道题里,有的链表短,他走完了就去走另一条链表,我们可以理解为走的快的指针。
    § 那么,只要其中一个链表走完了,就去走另一条链表的路。如果有交点,他们最终一定会在同一个位置相遇)
		A = headA
        B = headB
        while(A != B):
            A = A.next if A else headB
            B = B.next if B else headA
            print(A,B)
        return A

四、leetcode 142.环形链表II

1.题目链接:

link

2.独立做题问题总结

3.解法总结:

  1. 双指针
    首先判断是否有环:通过快慢指针, 当两者重合时说明有环
    通过快指针每次向前移动2位,慢指针每次移动1位,若两者相遇,则有环

其次判断环入口位置:通过从头节点和相遇节点同时移动指针,相遇处即为入口。

在这里插入图片描述
proof:
相遇时: slow指针走过的节点数为: x + y, fast指针走过的节点数:x + y + n (y + z),n为fast指针在环内走了n圈才遇到slow指针, (y+z)为 一圈内节点的个数A。

因为fast指针是一步走两个节点,slow指针一步走一个节点, 所以 fast指针走过的节点数 = slow指针走过的节点数 * 2:

(x + y) * 2 = x + y + n (y + z)

两边消掉一个(x+y): x + y = n (y + z)

因为要找环形的入口,那么要求的是x,因为x表示 头结点到 环形入口节点的的距离。

所以要求x ,将x单独放在左面:x = n (y + z) - y ,

再从n(y+z)中提出一个 (y+z)来,整理公式之后为如下公式:x = (n - 1) (y + z) + z 注意这里n一定是大于等于1的,因为 fast指针至少要多走一圈才能相遇slow指针。

这个公式说明什么呢?

先拿n为1的情况来举例,意味着fast指针在环形里转了一圈之后,就遇到了 slow指针了。

当 n为1的时候,公式就化解为 x = z,

这就意味着,从头结点出发一个指针,从相遇节点 也出发一个指针,这两个指针每次只走一个节点, 那么当这两个指针相遇的时候就是 环形入口的节点。

也就是在相遇节点处,定义一个指针index1,在头结点处定一个指针index2。

让index1和index2同时移动,每次移动一个节点, 那么他们相遇的地方就是 环形入口的节点。

	 	f = head
        s = head
        while(f != None and f.next != None):
            f = f.next.next
            s = s.next
            if(f == s):
                temp = head
                while(temp != f):
                    temp = temp.next
                    f = f.next
                return f
        return None
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值