题目:相交链表
题目描述:编写一个程序,找到两个单链表相交的起始节点。
如下面的两个链表:
在节点 c1 开始相交。
分析:这种判断节点的与昨天环形链表有相似的地方,首先每个链表的长度是不一样的,想要在同一时间都走到这个节点,就要保证,两个指针走的长度是一样的,首先A链表走到相交节点的长度为a,B链表走到相交节点的长度为b,往后的长度是一样的,假设为c,所以就让每个链表走到终点后从另一个链表的头开始走,这样每个人走到相交节点的长度是a+b+c,这样当相遇的时候就是相交的节点
代码:
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func getIntersectionNode(headA, headB *ListNode) *ListNode {
if headA==nil || headB==nil{
return nil
}
p1:=headA
p2:=headB
for p1!=p2{
if p1==nil{
p1=headB
}else{
p1=p1.Next
}
if p2==nil{
p2=headA
}else{
p2=p2.Next
}
}
return p1
}
题目: 两数之和 II - 输入有序数组
题目描述:给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。
函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
说明:
返回的下标值(index1 和 index2)不是从零开始的。
你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
示例:
输入: numbers = [2, 7, 11, 15], target = 9
输出: [1,2]
解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。
分析;没什么难度,直接上代码吧
代码:
func twoSum(numbers []int, target int) []int {
n:=len(numbers)
for i:=0;i<n-1;i++{
for j:=i+1;j<n;j++{
if numbers[i]+numbers[j]==target{
a:=[]int{i+1,j+1}
return a
}
}
}
return nil
}