mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-09 03:34:02 +08:00
Merge pull request #1312 from wzqwtt/pacth04
添加(0019.删除链表的倒数第N个节点、面试题02.07.链表相交)Scala版本
This commit is contained in:
@ -289,6 +289,28 @@ func removeNthFromEnd(_ head: ListNode?, _ n: Int) -> ListNode? {
|
|||||||
return dummyHead.next
|
return dummyHead.next
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
Scala:
|
||||||
|
```scala
|
||||||
|
object Solution {
|
||||||
|
def removeNthFromEnd(head: ListNode, n: Int): ListNode = {
|
||||||
|
val dummy = new ListNode(-1, head) // 定义虚拟头节点
|
||||||
|
var fast = head // 快指针从头开始走
|
||||||
|
var slow = dummy // 慢指针从虚拟头开始头
|
||||||
|
// 因为参数 n 是不可变量,所以不能使用 while(n>0){n-=1}的方式
|
||||||
|
for (i <- 0 until n) {
|
||||||
|
fast = fast.next
|
||||||
|
}
|
||||||
|
// 快指针和满指针一起走,直到fast走到null
|
||||||
|
while (fast != null) {
|
||||||
|
slow = slow.next
|
||||||
|
fast = fast.next
|
||||||
|
}
|
||||||
|
// 删除slow的下一个节点
|
||||||
|
slow.next = slow.next.next
|
||||||
|
// 返回虚拟头节点的下一个
|
||||||
|
dummy.next
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
-----------------------
|
-----------------------
|
||||||
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>
|
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>
|
||||||
|
@ -317,7 +317,55 @@ ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Scala:
|
||||||
|
```scala
|
||||||
|
object Solution {
|
||||||
|
def getIntersectionNode(headA: ListNode, headB: ListNode): ListNode = {
|
||||||
|
var lenA = 0 // headA链表的长度
|
||||||
|
var lenB = 0 // headB链表的长度
|
||||||
|
var tmp = headA // 临时变量
|
||||||
|
// 统计headA的长度
|
||||||
|
while (tmp != null) {
|
||||||
|
lenA += 1;
|
||||||
|
tmp = tmp.next
|
||||||
|
}
|
||||||
|
// 统计headB的长度
|
||||||
|
tmp = headB // 临时变量赋值给headB
|
||||||
|
while (tmp != null) {
|
||||||
|
lenB += 1
|
||||||
|
tmp = tmp.next
|
||||||
|
}
|
||||||
|
// 因为传递过来的参数是不可变量,所以需要重新定义
|
||||||
|
var listA = headA
|
||||||
|
var listB = headB
|
||||||
|
// 两个链表的长度差
|
||||||
|
// 如果gap>0,lenA>lenB,headA(listA)链表往前移动gap步
|
||||||
|
// 如果gap<0,lenA<lenB,headB(listB)链表往前移动-gap步
|
||||||
|
var gap = lenA - lenB
|
||||||
|
if (gap > 0) {
|
||||||
|
// 因为不可以i-=1,所以可以使用for
|
||||||
|
for (i <- 0 until gap) {
|
||||||
|
listA = listA.next // 链表headA(listA) 移动
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
gap = math.abs(gap) // 此刻gap为负值,取绝对值
|
||||||
|
for (i <- 0 until gap) {
|
||||||
|
listB = listB.next
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 现在两个链表同时往前走,如果相等则返回
|
||||||
|
while (listA != null && listB != null) {
|
||||||
|
if (listA == listB) {
|
||||||
|
return listA
|
||||||
|
}
|
||||||
|
listA = listA.next
|
||||||
|
listB = listB.next
|
||||||
|
}
|
||||||
|
// 如果链表没有相交则返回null,return可以省略
|
||||||
|
null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
-----------------------
|
-----------------------
|
||||||
|
Reference in New Issue
Block a user