剑指 Offer 18. 删除链表的节点、21. 调整数组顺序使奇数位于偶数前面、22. 链表中倒数第k个节点、25. 合并两个排序的链表、52. 两个链表的第一个公共节点、57. 和为s的两个数字、58 - I. 翻转单词顺序
题目描述:
[18]
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。
返回删除后的链表的头节点。
[21]
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。
[22]
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。
例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。
[25]
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
[52]
[57]
输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。
[58 - I]
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。
考察重点:
第18题一个指针匹配目标删除节点,一个节点记录该节点的上一位,便于删除
第21题使用left,right分别指向数组左右,分别搜索偶数与奇数,二者分别指向目标节点后,交换二者位置,直到 left>=right
第22题slow指针从首节点开始,quick指针向后移k位,当quick指向末尾,slow即指向倒数第k位
第25题合并链表,每次比较两链表头结点并将小的节点加入结果链表,直到遍历完成两链表
第52题假设两链表长度分别为A和B,则有A+B=B+A,即分别用两指针从两链表头结点开始向后移动,分别到达末尾处后,则从另一链表头结点重新开始向后移动,则二者必会在交点处相交
第57题使用slow记录其中一个结果数字,二分法在slow之后查找第二个结果数字
第58 - I题slow记录每个单词起始位置,quick记录每个单词终止位置,遍历整个字符串
第18题
func deleteNode(head *ListNode, val int) *ListNode {temp := &ListNode{}temp.Next = headlay := temp // lay延迟一位,负责在head找到目标节点时,执行删除操作for head != nil{if head.Val == val{lay.Next = lay.Next.Nextreturn temp.Next}lay = headhead = head.Next}return temp.Next
}
第21题
func isOdd(num int)bool{return num % 2 == 1
}
func change(nums []int, a, b int){temp := nums[a]nums[a] = nums[b]nums[b] = temp
}
func exchange(nums []int) []int {left, right := 0, len(nums) - 1for left < right{for left < right && isOdd(nums[left]){left ++}for left < right && !isOdd(nums[right]){right --}if left < right{change(nums, left, right) }}return nums
}
第22题
func getKthFromEnd(head *ListNode, k int) *ListNode {quick, slow := head, headfor i := 0;i < k;i ++{quick = quick.Next}for quick != nil{slow = slow.Next;quick = quick.Next;}return slow;
}
第25题
func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {res := &ListNode{}temp := resfor l1 != nil || l2 != nil{if l1 == nil{ // 任意一方为空,则将另一方的全部元素加入结果链表尾部res.Next = l2break}if l2 == nil{res.Next = l1break}if l1.Val < l2.Val{res.Next = l1res = res.Nextl1 = l1.Next}else{res.Next = l2res = res.Nextl2 = l2.Next}}return temp.Next
}
第52题
func getIntersectionNode(headA, headB *ListNode) *ListNode {if headA == nil || headB == nil{return nil}tempA, tempB := headA, headBfor headA != headB{headA = headA.NextheadB = headB.Nextif headA == nil && headB == nil{break}if headA == nil{headA = tempB}if headB == nil{headB = tempA}}return headA
}
第57题
func twoSum(nums []int, target int) []int {slow, nLen := 0, len(nums)for slow < nLen{left, right := slow + 1, nLen - 1for left <= right{mid := left + (right - left) / 2if nums[mid] == target - nums[slow]{return []int{nums[slow], nums[mid]}}else if nums[mid] < target - nums[slow]{left = mid + 1}else{right = mid - 1}}slow ++}return []int{}
}
第58 - I题
func reverseWords(s string) string {res := ""for slow := 0;slow < len(s);{if s[slow] == ' '{slow ++continue}quick := slow + 1for ;quick < len(s);quick ++{if s[quick] == ' '{break}} if len(res) == 0{res = s[slow:quick]}else{res = s[slow:quick] + " " + res}slow = quick + 1}return res
}