文章目录
提示:以下是本篇文章正文内容,下面案例可供参考
一、leetcode 24. 两两交换链表中的节点
1.题目链接:
2.独立做题问题总结
一开始做的时候用的双指针
3.解法总结:
- 双指针法
创建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
- 递归法
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.题目链接:
2.独立做题问题总结
一开始做的时候用的双指针法
3.解法总结:
- 双指针
首先通过快指针向前移动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.题目链接:
2.独立做题问题总结
3.解法总结:
- 双指针
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.题目链接:
2.独立做题问题总结
3.解法总结:
- 双指针
首先判断是否有环:通过快慢指针, 当两者重合时说明有环
通过快指针每次向前移动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